1

INFORMATION_SCHEMA.COLUMNSを使用して、非常に多くの列を持つテーブルのストアドプロシージャをより高速に構築できるようにしたいと思います。

たとえば、100列のテーブルのMERGEステートメントのupdate句の場合、COLUMN_1 = SOURCE.COLUMN1, COLUMN2...100回実行する必要がありますが、これは楽しいことではありません。

オブジェクトブラウザからupdate/create / etcステートメントをスクリプト化できることは知っていますが、フォーマットをもう少し制御したいと思います。それで:

このクエリは、上記の各列の更新形式を出力します。

select column_name + ' = SOURCE.' + column_name + ', ' 
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = 'TableName'

残念ながら、それは複数の結果としてそうします:

COLUMN_1 = SOURCE.COLUMN_1,
COLUMN_2 = SOURCE.COLUMN_2,
etc.

質問:

上記のクエリを変更してすべての結果を連結し、出力が次のようになる方法を誰かに教えてもらえますか?

COLUMN_1 = SOURCE.COLUMN_1, COLUMN_2 = SOURCE.COLUMN_2, etc.

PS:カーソルを使って循環し、この結果を達成する方法を知っています。可能であれば、この目的のためにピボットまたはいくつかのT-SQL関数を使用してクエリでそれを行う方法を見つけたいと思います。

4

1 に答える 1

1

EricZが言ったように、最後にFOR XML PATH('')を追加する必要があります

必要に応じて、出力はxmlではなくvarcharになり、キャストを使用します

select cast((select column_name + ' = SOURCE.' + column_name + ', ' 
             from INFORMATION_SCHEMA.COLUMNS
             where TABLE_NAME = 'TableName'
             FOR XML PATH(''))  
       as varchar)  

変数を使用することもできます

declare @str varchar(8000) = ''  

select @str += column_name + ' = SOURCE.' + column_name + ', ' 
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = 'TableName'

set @str = left(@str,len(@str))
于 2012-08-20T11:51:24.240 に答える