無論如何將下面的代碼放入Table-Valued(內聯或多語句)甚至視圖中。我可以在存儲過程中使用它,但要做到無法連接到存儲過程的結果,我寧願將它放在Table-Valued函數或View中。sp_MSForEachDB函數中的副作用運算符無效
下面是給我的結果的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的結果。
好部分是「如果答案上面沒有...有沒有重寫語句,以任何方式它不使用動態SQL?「我知道spMSForEachDB將來可能會被棄用,如果是這樣的話,我只需要寫我自己的就可以做我需要的。 –
另外,您提到的http://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/替換sp_MSForEachDB在我的方案中不起作用。除非我將USE [?]行註釋掉,否則它會彈出。如果這被註釋掉了,我只能從master數據庫獲得信息,或者我正在使用哪個數據庫。 –
我收到Msg 911,Level 16,State 1,Line 4 Database'[SomeDatabase]; \t \t PRINT'[SomeDatabase'不存在。確保名稱輸入正確。 –