我希望在表中存在的每个数据库中查询表中的列。到目前为止,我有以下内容,但我不确定从哪里开始:
DECLARE @tblName VARCHAR(5000) = 'myTable'
SELECT name
FROM sys.databases
WHERE CASE
WHEN state_desc = 'ONLINE'
THEN OBJECT_ID(QUOTENAME(name) + '.[dbo].['+@tblName+']','U')
END IS NOT NULL
到目前为止,我可以使用我正在查找的表返回所有数据库但是我希望SQL服务器上每个数据库中指定表中特定列的所有列数据。感谢您的帮助。
答案 0 :(得分:5)
sp_foreachdatabase提供了一个很好的快捷方式:http://www.mssqltips.com/sqlservertip/1414/run-same-command-on-all-sql-server-databases-without-cursors/
答案 1 :(得分:0)
sp_MSForEachDb
可能是错误的,跳过数据库和其他奇怪的东西。有一个替代程序here具有非常相似的用法。
另一种方式是
DECLARE @tbl SYSNAME = 'sys.objects'
DECLARE @sql NVARCHAR(MAX)
SET @sql = CAST((SELECT 'IF EXISTS(SELECT 1 FROM ' + QUOTENAME(name) + '.' + @tbl + ')' +
' SELECT TOP 1 ''' + QUOTENAME(name) + ''' db, * FROM ' + QUOTENAME(name) + '.' + @tbl AS 'data()'
FROM sys.databases
WHERE database_id > 4
FOR XML PATH('')) AS NVARCHAR(MAX))
EXEC (@sql)
答案 2 :(得分:0)
你可以使用这样的东西
Create #tempTable(col datatype, col1 datatyep.....)
;EXEC sp_msforeachdb 'USE [?]
IF DB_NAME() IN(SELECT name
FROM sys.databases
WHERE CASE
WHEN state_desc = ''ONLINE''
THEN OBJECT_ID(QUOTENAME(name) + ''.[dbo].[myTable]'',''U'')
END IS NOT NULL)
INSERT INTO #tempTable
SELECT mycolumn from my table
'
SELECT * from #tempTable