2

とにかく、以下のコードをテーブル値 (インラインまたはマルチステートメント) またはビューに入れることはありますか? ストアド プロシージャで使用することはできますが、ストアド プロシージャの結果に結合できないため、むしろテーブル値関数またはビューに配置します。

以下は、私が探している結果を与えるSQLです

DECLARE @ColumnInformation TABLE
(
    DatabaseName NVARCHAR(255),
    TableSchema NVARCHAR(255),
    TableName NVARCHAR(255),
    ColumnName NVARCHAR(255),
    TableType NVARCHAR(255),
    FullyQualifiedTableName NVARCHAR(255),
    FullyQualifiedColumnName NVARCHAR(255)
)
INSERT INTO @ColumnInformation
EXECUTE master.sys.sp_MSForEachDB  '
IF ''?'' NOT IN (''master'', ''tempdb'', ''msdb'', ''model'', ''ReportServer'', ''ReportServerTempDB'' )
BEGIN
    USE [?];
    PRINT ''?''
    SELECT 
         T.TABLE_CATALOG AS DatabaseName
        ,T.TABLE_SCHEMA as TableSchema  
        ,T.TABLE_NAME AS TableName
        ,C.COLUMN_NAME AS ColumnName
        ,T.TABLE_TYPE AS TableType
        ,''['' + T.TABLE_CATALOG + ''].['' + T.TABLE_SCHEMA + ''].['' + T.TABLE_NAME + '']'' AS FullyQualifiedTableName
        ,''['' + T.TABLE_CATALOG + ''].['' + T.TABLE_SCHEMA + ''].['' + T.TABLE_NAME + ''].['' + C.COLUMN_NAME + '']'' FullyQualifiedColumnName
    FROM INFORMATION_SCHEMA.TABLES as t inner join
        INFORMATION_SCHEMA.COLUMNS as c on c.table_name = t.table_name
END
'

SELECT * 
FROM @ColumnInformation
ORDER BY DatabaseName, TableSchema, TableName, ColumnName

ただし、テーブル値関数に入れようとすると、エラーが発生します

Msg 443, Level 16, State 14, Procedure fGetAllColumnInformation, Line 17
Invalid use of a side-effecting operator 'INSERT EXEC' within a function.

sp_MSForEachDb は動的 SQL を生成していると思いますが、確かではありません。動的 SQL はテーブル値関数では使用できないと聞いたことを漠然と覚えています。この場合、上記のコードをテーブル値関数またはビューで使用できるように、その制限をバイパスする方法があります。

上記の答えが「いいえ」の場合...動的 SQL を使用しないようにステートメントを書き直す方法はありますか?

私は基本的に、SQL Server 上のすべてのデータベースからのすべての INFORMATION_SCHEMA.COLUMNS の結果を統合しようとしています。

4

1 に答える 1