0

ここや他の場所で検索しましたが、まだ答えが見つかりません。見逃さなかったことを願っています。

SQL Server Management Studio 2008 R2 を使用。

サーバーに n 個の特定のデータベースがあります (他の DB もありますが、そのうちのいくつかにのみ関心があります)

これらの各データベースにはテーブルがあり、それらはすべて同じ名前です。唯一の違いは DB 名です。これらのテーブルをまとめて、別のデータベース (他の DB とは異なる) に 1 つの大きなテーブルを作成したいと考えています。

クエリの結果からデータベース名を取得できます。

Nは不明です。

ループはこれについて行く方法ですか?

次の疑似コードの行に沿って何かを考えていました。

Set @dbnames = SELECT DISTINCT dbname FROM MyServer.dbo.MyTable

For each @name in @dbnames
    INSERT INTO ADifferentDB.dbo.MyOtherTable
    SELECT * FROM @name.dbo.table
Next name

(明らかに、ご覧のとおり、私は SQL 変数を使用するのも初めてです)

4

3 に答える 3

4

最初の問題は、データベースの反復に関するものです。カーソルを使用してそれを行うことができます

次に、一部が変数 (データベースの名前) であるクエリを実行すると、別の問題が発生します。関数でそれを行うことができますexecute

これはすべて次のようなものです。

DECLARE @query VARCHAR(max)
DECLARE @dbname VARCHAR(100)
DECLARE my_db_cursor CURSOR
            FOR SELECT DISTINCT dbname FROM MyServer.dbo.MyTable
OPEN my_db_cursor 
FETCH NEXT FROM my_db_cursor 
INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @query = 'INSERT INTO ADifferentDB.dbo.MyOtherTable
                   SELECT * FROM ' + @dbname + '.dbo.table'
    EXECUTE(@query)  

    FETCH NEXT FROM my_db_cursor 
    INTO @dbname
END
CLOSE my_db_cursor 
DEALLOCATE my_db_cursor 
于 2012-09-28T18:10:29.623 に答える
1

あなたがしたいことはCURSOR、行レベルの操作を定義することです。ここにいくつかのドキュメントがあります

于 2012-09-28T18:01:24.500 に答える
1

使用することをお勧めしsp_MSForEachDBます:

EXEC sp_MSForEachDB '
-- Include only the databases you care about.
IF NOT EXISTS (
    SELECT *
    FROM MySever.dbo.MyTable
    WHERE dbname = ''?''
)
    -- Exit if the database is not in your table.
    RETURN

-- Otherwise, perform your insert.
INSERT INTO ADifferentDB.dbo.MyOtherTable
SELECT * FROM ?.dbo.table
'

この場合、?はサーバー上の各データベースに置き換えられるトークンです。

于 2012-09-28T18:17:31.820 に答える