无论如何将以下代码放入表值(内联或多语句)甚至视图中。我可以在存储过程中使用它,但是无法对存储过程的结果进行连接我宁愿将它放在表值函数或视图中。
下面是给我我正在寻找的结果的 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 的结果。