當談到 SQL 時,我是一個完全的新手。我發現這個查詢給了我所有的表和列:
SELECT schema_name(tab.schema_id) as schema_name,
tab.name as table_name,
col.column_id,
col.name as column_name,
t.name as data_type,
col.max_length,
col.precision
FROM sys.tables as tab
INNER JOIN sys.columns as col
on tab.object_id = col.object_id
LEFT JOIN sys.types as t
on col.user_type_id = t.user_type_id
ORDER BY schema_name,
table_name,
column_id;
但它只向我展示了來自 1 個特定資料庫的結果。它忽略了其他一些也有自己的資料庫的鏈接服務器。
是否有一個查詢會從每個可見的服務器/資料庫中抓取所有表?
我還閱讀了該sys.servers命令,它確實給了我可見服務器的串列,但我沒有足夠的查詢經驗來撰寫實作上述目標的陳述句。
uj5u.com熱心網友回復:
您需要使用動態 SQL 從所有資料庫中進行選擇。您還需要使用動態 SQL 從所有鏈接服務器中進行選擇。所以你需要動態而不是動態。
CREATE TABLE #DBs (dbname nvarchar(515) NOT NULL);
INSERT #DBs (dbname)
SELECT QUOTENAME(d.name)
FROM sys.databases d;
DECLARE @sql nvarchar(max);
SELECT @sql =
STRING_AGG(CAST(
'
INSERT #DBs (dbname)
SELECT QUOTENAME(' QUOTENAME(s.name, '''') ') ''.'' QUOTENAME(d.name)
FROM ' QUOTENAME(s.name) '.master.sys.databases d
' AS nvarchar(max)), '
;
' )
FROM sys.servers s
WHERE s.server_id > 0;
PRINT @sql;
EXEC sp_executesql @sql;
SELECT @sql = STRING_AGG(CAST(
'
SELECT
''' REPLACE(d.dbname, '''', '''''') ''' as db_name,
schema_name(tab.schema_id) as schema_name,
tab.name as table_name,
col.column_id,
col.name as column_name,
t.name as data_type,
col.max_length,
col.precision
FROM ' d.dbname '.sys.tables as tab
INNER JOIN ' d.dbname '.sys.columns as col
on tab.object_id = col.object_id
LEFT JOIN ' d.dbname '.sys.types as t
on col.user_type_id = t.user_type_id
' AS nvarchar(max)), '
UNION ALL
' )
'
ORDER BY
db_name,
schema_name,
table_name,
column_id;
'
FROM #DBs d;
PRINT @sql;
EXEC sp_executesql @sql;
DROP TABLE #DBs;
db<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/510531.html
