1

データベースにテーブル「Foobar」が含まれているサーバー上のデータベースのリストを取得しようとしています。私が遭遇している障害は、@CurrDB を INFORMATION_SCHEMA と組み合わせて使用​​する方法を理解できないことです。助言がありますか?

DECLARE @CurrDB varchar(255)
DECLARE RecSet CURSOR FOR
Select [name] FROM master..sysdatabases
OPEN RecSet

Fetch NEXT FROM RecSet Into @CurrDB

WHILE (@@FETCH_STATUS = 0)   
BEGIN 
    Fetch NEXT FROM RecSet Into @CurrDB
    IF (EXISTS (SELECT * FROM @CurrDB..INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Foobar')) 
    BEGIN 
        print @CurrDB
        --do other stuff
    END 
END

Close RecSet
DEALLOCATE RecSet
4

2 に答える 2

3

これを試して:

sp_msforeachdb 'SELECT ''?'' As DatabaseName 
                FROM   [?].INFORMATION_SCHEMA.TABLES 
                WHERE  TABLE_Name = ''foobar'''

次のコードを使用して、テーブル変数にデータベース名のリストを入力することもできます。

Declare @DatabaseList Table(DatabaseName VarChar(200))

insert Into @DatabaseList
Exec sp_msforeachdb 'If Exists(SELECT ''?'' As DatabaseName 
                FROM   [?].INFORMATION_SCHEMA.TABLES 
                WHERE  TABLE_Name = ''YourTableNameHere'') Select ''?'''

Select * From @DatabaseList
于 2012-05-07T15:47:28.570 に答える
0

次のストアド プロシージャは、この SP に渡されたパラメータに従って、すべてのデータベースとテーブルを表示します。

CREATE PROCEDURE Usp_findtablenameinalldatabase @TableName VARCHAR(256) 
AS 
    DECLARE @DBName VARCHAR(256) 
    DECLARE @varSQL VARCHAR(512) 
    DECLARE @getDBName CURSOR 

    SET @getDBName = CURSOR 
    FOR SELECT name 
        FROM   sys.databases 

    CREATE TABLE #tmptable 
      ( 
         DBName     VARCHAR(256), 
         SchemaName VARCHAR(256), 
         TableName  VARCHAR(256) 
      ) 

    OPEN @getDBName 

    FETCH next FROM @getDBName INTO @DBName 

    WHILE @@FETCH_STATUS = 0 
      BEGIN 
          SET @varSQL = 'USE ' + @DBName + '; INSERT INTO #TmpTable SELECT ''' + @DBName + 
          ''' AS DBName, SCHEMA_NAME(schema_id) AS SchemaName, name AS TableName FROM sys.tables WHERE name LIKE ''%' 
          + @TableName + 
                        '%''' 

          EXEC (@varSQL) 

          FETCH next FROM @getDBName INTO @DBName 
      END 

    CLOSE @getDBName 

    DEALLOCATE @getDBName 

    SELECT * 
    FROM   #tmptable 

    DROP TABLE #tmptable 

go 

このspを呼び出す方法:

EXEC usp_FindTableNameInAllDatabase 'TableName'
于 2012-05-07T15:54:31.913 に答える