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

あなたはこのようなものを使うことができます

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 に答える
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 に答える