質問

いくつかのデータベース メタデータを結合するビューを 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

ちょうど思考...あなたはシンプル言った: - )

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top