TSQL ビュー (ピボット?) のデータ行から文字列連結を実行する
-
22-09-2019 - |
質問
いくつかのデータベース メタデータを結合するビューを SQL Server に作成したいと考えています。
必要なメタデータの 1 つは、 sys.syscomments
テーブル - 関連する列は次のとおりです。
id colid text
---- ------ -------------
1001 1 A comment.
1002 1 This is a lo
1002 2 ng comment.
1003 1 This is an e
1003 2 ven longer c
1003 3 omment!
ご覧のとおり、「text」列のデータは最大長 (SQL Server では 8000 バイト/4000 文字、この例では 12 文字) を超えると複数の行に分割されます。 colid
テキストを組み立てる順序を指定します。
私のビューでクエリ/サブクエリを作成して、sys.syscomments テーブルからのコメントを再構築して、次のようにしたいと思います。
id comment (nvarchar(max))
---- ----------------------------------
1001 A comment.
1002 This is a long comment.
1003 This is an even longer comment!
何か提案や解決策はありますか?速度は決して重要ではありませんが、シンプルさと影響の少なさが重要です (CLR 関数などは避けたいと考えています。理想的には、すべてがビュー定義にまとめられることです)。XML ベースの提案をいくつか検討しましたが、その結果、XML エスケープ文字列で埋められたテキストが生成されました。
解決
SELECT id,
(
SELECT text AS [text()]
FROM mytable mi
WHERE mi.id = md.id
ORDER BY
mi.col
FOR XML PATH(''), TYPE
).value('/', 'NVARCHAR(MAX)')
FROM (
SELECT DISTINCT id
FROM mytable
) md
他のヒント
考えられる解決策はいくつかあります。最も簡単な方法は CTE を使用することです。この記事には、次のトピックに関する優れた議論が含まれています。 Transact-SQL での行値の連結
くはこちらをご覧ください: 連結値から複数の列を一つの列の順序
は使用しないのはなぜ sys.sql_modulesする単一のnvarchar(MAX)としてデータを格納する定義の列?
の代わりに、いくつかのsyscommentsを読み取るテキスト(NVARCHAR(4000))カラム複数の行にわたって広がり、CONCATENATEを有する。
SELECT object_id, definition FROM sys.sql_modules
ちょうど思考...あなたはシンプル言った: - )