0

次のことが起こる任意の MS SQL Server で実行できる SQL スクリプトを作成しています。

一時テーブルは、ID #、dbname、および処理された? 桁。

システムは、データベース名を SQL ステートメントの一部として使用して、一時テーブルの各行を反復処理します。

これは私が現在持っているものです:

DECLARE @ID INT
CREATE TABLE #DBNAME (ID varchar(3), dbname varchar(100), processed varchar(1))
BEGIN
INSERT INTO #DBNAME(ID, dbname)
SELECT database_id, name FROM sys.databases
END
BEGIN
UPDATE #DBNAME SET processed = '0'
WHERE dbname IS NOT NULL
END
BEGIN


END
select * from #DBNAME
WHILE (SELECT COUNT(*) From #DBNAME Where processed = 0) > 0
BEGIN
    SELECT TOP 1 @ID = ID from #DBName Where processed = 0
    select * from [#DBNAME.dbname].installinfo where installed='Success'

現在、#DBName.dbname.installinfoは有効なオブジェクトではないため機能していません。これを行う方法がわかりません。selectステートメントが0行以上を返す場合、追加情報を収集する必要があるため、スクリプトはそこで実行されませんが、[#DBNAME.dbname]作業を開始できるように部品を正しく取得できれば、それをうまく配置できると思います反復データベースで。

何か案は?

4

2 に答える 2

1

テーブルの値を別のクエリのテーブル名として使用するには、動的SQLを使用する必要があります。

DECLARE @sql VARCHAR(8000),@tblname VARCHAR(255)
SET @tblname = SELECT stuff FROM Table
SET @sql = 'select * from '+@tblname+' where installed=''Success''
           '

EXEC (@sql)
于 2013-06-28T18:04:38.977 に答える
1

動的SQLステートメントを書くことをお勧めします:

DECLARE @dbname AS NVARCHAR(MAX);
SELECT @dname = name FROM #DBNAME ID = @ID;
DECLARE @sql as NVARCHAR(MAX);
SET @sql = 'SELECT * FROM ' + @dbname + '.installinfo where installed = ''Success''';
EXEC sp_executesql @sql;

于 2013-06-28T18:04:41.817 に答える