2

我希望在表存在的每个数据库中查询表中的列。到目前为止,我有以下内容,但不确定从这里去哪里:

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 服务器上每个数据库中指定表中特定列的所有列数据。提前谢谢你的帮助。

4

3 回答 3

5

sp_foreachdatabase 是一个不错的快捷方式: http ://www.mssqltips.com/sqlservertip/1414/run-same-command-on-all-sql-server-databases-without-cursors/

于 2013-10-29T17:13:19.110 回答
0

sp_MSForEachDb可能是错误的,跳过数据库和其他奇怪的东西。这里有一个替代过程,其用法非常相似。

另一种方法是

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)
于 2013-10-29T17:35:11.993 回答
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
于 2015-09-03T04:34:57.433 回答