2013/11/29

[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

2013/11/21

[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-
素直に関数を作ったほうがいいか……。

2013/11/20

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


Excel で連番を振ったものの、行の挿入をして下の行番号がすべてズレてしまうことがあるが、OFFSET 関数を使えば常に上の行を参照することができる。

必須パラメータは以下の通り。
OFFSET(参照, 行数, 列数)

参照 : 基準とするセル
行数 : 参照からみた行 (縦)。マイナスを付けると上の行を参照する。
列数 : 参照から見た列 (横)。マイナスが左、プラスが右の列を参照。省略可能。

この例では、A2 から見て一行上を参照してその値に 1 を足す、となる。
=OFFSET(A2, -1, ) + 1

2013/11/19

[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 に変換する際には気をつけないといけない。

2013/11/18

[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 データベースへの検索をさせないらしいのだが、誤差の範囲なのだろう。あまりこのことに触れられているドキュメントは見当たらない。
Related Posts Plugin for WordPress, Blogger...