投稿

11月, 2013の投稿を表示しています

[SQL Server] INSERT INTO SELECT で DB 間のテーブルコピー

別の DB でなくても、INSERT 文には他のテーブルの SELECT を使用できる。 -- HAGE テーブルのデータをすべて HOGE テーブルにコピーする。 INSERT INTO HOGE SELECT * HAGE -- HAGE テーブルの一部のデータ (以下の例だと NAME と AGE) を HOGE テーブルにコピーする。 INSERT INTO HOGE SELECT NAME, AGE HAGE -- DB が違っていてもコピーできる。 -- HOGE テーブル (dbo 所有 TEST1 データベース) を、すべて HOGE テーブル (dbo 所有 TEST2 データベース) にコピーする。 INSERT INTO TEST1.dbo.HOGE SELECT * TEST2.dbo.HOGE

[SQL Server] Is this the most simply RPAD and LPAD?

Get 20 charactors and RPAD with zero. SELECT REPLACE(CONVERT(NCHAR(20), 'SQLServer2014-'), SPACE(1), '0') -- Result : SQLServer2014-000000 Get 20 charactors and LPAD with zero. SELECT REPLACE(REVERSE(CONVERT(NCHAR(20), REVERSE('SQLServer2014-'))), SPACE(1), '0') -- Result :  000000SQLServer2014-

[SQL Server] 文字列の空白埋めと 0 埋めを一行で実現

強引な方法だが、独自関数なしに実現してしまう方法。 文字列を 20 文字抜き出す。20 文字以下の場合は後ろを空白で埋める。 SELECT CONVERT(NCHAR(20), 'SQLServer2014-') -- 結果(後ろに空白がある) : SQLServer2014-     文字列を 20 文字抜き出し、かつ、20 文字以下の場合は後ろを '0' で埋める (擬似 RPAD)。 SELECT REPLACE(CONVERT(NCHAR(20), 'SQLServer2014-'), SPACE(1), '0') -- 結果 : SQLServer2014-000000 文字列を 20 文字抜き出し、かつ、20 文字以下の場合は前を '0' で埋める (擬似 LPAD)。 SELECT REPLACE(REVERSE(CONVERT(NCHAR(20), REVERSE('SQLServer2014-'))), SPACE(1), '0') -- 結果 :  000000SQLServer2014- 素直に関数を作ったほうがいいか……。

[Excel] 一行上のセルを参照する OFFSET 関数

イメージ
Excel で連番を振ったものの、行の挿入をして下の行番号がすべてズレてしまうことがあるが、OFFSET 関数を使えば常に上の行を参照することができる。 必須パラメータは以下の通り。 OFFSET(参照, 行数, 列数) 参照 : 基準とするセル 行数 : 参照からみた行 (縦)。マイナスを付けると上の行を参照する。 列数 : 参照から見た列 (横)。マイナスが左、プラスが右の列を参照。省略可能。 この例では、A2 から見て一行上を参照してその値に 1 を足す、となる。 =OFFSET(A2, -1, ) + 1

[SQL Server] 文字型の違い (varchar, nvarchar)

業務アプリのデータベース設計では、未だに何も考えずに文字列は varchar で定義してあることが多い。そして、文字はすべからく「全角 2 バイト、半角 1 バイト」である、という概念が未だに残っている現場や技術者が多い。 nchar および nvarchar (Transact-SQL) - msdn http://msdn.microsoft.com/ja-jp/library/ms186939.aspx nvarchar は全角であろうが半角であろうが文字数がそのままデータ長になるのだが、それより重要な意味は Unicode をサポートしているということであろう。 What is the difference between char, nchar, varchar, and nvarchar in SQL Server? - Stack Overflow http://stackoverflow.com/questions/176514/what-is-the-difference-between-char-nchar-varchar-and-nvarchar-in-sql-server 最近の OS、プラットフォームは内部動作として Unicode であることがほとんどであるから、アスキーコードのみサポートされた環境でない限り、nvarchar を採用するほうが無難であるとのこと。 逆に言うと、varchar で定義されているものを nvarchar に変換する際には気をつけないといけない。

[SQL Server] バイト数で文字列を切り出す

SQL Server には LENB のようなバイト数をカウントする関数はないようだが、文字列を切り出すという目的であれば、型変換を利用して擬似的に実現することができる。 先頭から 6 バイト分切り出し。 SELECT CONVERT(VARCHAR(6), 'SQLサーバー2014') -- 結果 : SQLサ 後ろから 6 バイト切り出すためには、右側から抜き出したい場合は REVERSE 関数で反転させてから抜き出し、さらに戻す。 ※ RIGHT 関数はバイト数ではなく、文字数で取得するため使用できない。 SELECT REVERSE(CONVERT(VARCHAR(6), REVERSE('SQLサーバー2014'))) -- 結果 : ー2014

[SQL Server] ストアド名の命名規則についての意外な事実

ストアド名を何気なく 'sp_' から始めているプロジェクトは多岐にわたると思う。しかし、これは実は望ましくないという記事をふと見かけた。 ストアドプロシージャの名前にsp_はダメらしい。 http://blogs.yahoo.co.jp/yottun8/62433363.html (元記事) Should Stored Procedure name start with SP_ ??? http://www.sqlserver-training.com/should-stored-procedure-name-start-with-sp_/- SQL Server には、'sp_' から始まるシステムストアドプロシージャがあるが、自分で定義したストアドに関しても接頭語が 'sp_' である場合は、まず master データベースを探すらしい。そのため、ミリ秒の世界ではあるが、遅くなることは遅くなるとか。 ファイルのパスをすべて書くことで master データベースへの検索をさせないらしいのだが、誤差の範囲なのだろう。あまりこのことに触れられているドキュメントは見当たらない。