1

データベース A からデータベース B にデータをインポートするストアド プロシージャがあります。顧客がいて、すべて独自のデータベース B (同じテーブルなど) を持っています。また、独自のデータベース A も持っています。ストアド プロシージャは次のようになります。データベース B で実行 (デプロイ) されます。

問題:
各顧客は、A と B に別のデータベース名を持っています。また、データベース A が別のサーバー/インスタンス上にある可能性があることもわかりました。サーバー/インスタンス名と A からのデータベース名をストアド プロシージャに自動的に配置して、そこからデータを選択する一般的な方法が必要です。すべての顧客は、データベース B に既に存在するデータベース A への接続文字列を持っています。したがって、接続文字列から、サーバー/インスタンス名と A のデータベース名を取得できます (既にリンク サーバーを作成しています)。

1. テーブル名の前にサーバー/インスタンス名とデータベース名を付ける最良の方法は何ですか??

ストアド プロシージャ ストアド プロシージャ
では、多くの変数 (宣言) テーブルを使用して、データベース A からデータを挿入しました。動的 SQL の使用に関する記事はたくさんありますが、宣言テーブルの例を見つけることができません。

私の解決策
データベースAのすべてのデータを変数テーブルに挿入することを考えています。私は7つのテーブルからデータをインポートしているので、7つのテーブルを宣言する必要があり、さらにSPで宣言テーブルからデータを選択できます。ホール ストアド プロシージャは非常に大きいことに注意してください。

質問
2.私の解決策についてどう思いますか?

3.別の解決策はありますか?

4.動的SQLを使用して宣言テーブルに挿入するにはどうすればよいですか?

**SQL Server 2005 を使用していることに注意してください。

 I have a few statements like below:

 declare @Temp table (Id int, etc
 insert into @Temp (Id, etc)
 Select Id, etc
 From [databasename].dbo.TableName   //hardcoded
 Where .......

 // doing staff like selecting from the @Temp table etc.


I also have subqueries, but I can change if it is necessary.
4

3 に答える 3

2

一時テーブルはセッションでのみ使用できるため、動的SQLを使用して宣言テーブルに入ることはできません。動的SQLを介して新しいSQLを実行すると、新しいセッションが作成されます。

宣言されたテーブルや一時テーブルを使用せずに、通常のテーブルを使用することで回避できます。動的SQLはこれにアクセスでき、あなたがそれに対して行ったことが失われることはありません.

通常のテーブルに Temp_ のようなプレフィックスを付けて、それらが一時テーブルであることを確認し、各クエリの最初にドロップするようにすることができます。

DROP TABLE TEMP_Table

次のようにして、複数のローカルデータベースを呼び出すことができます

SELECT * FROM [DatabaseName].dbo.[TableName]
于 2013-01-30T08:40:30.580 に答える
1

#temp を作成する代わりに、[TempDB].[DBO].[Temp] として作成すると、動的 SQL の外部からアクセスできるようになります。ただし、完了したら、明示的にテーブルを削除することを忘れないでください

DECLARE @sql VARCHAR(200)
SET @sql = 'CREATE TABLE tempdb.dbo.temp(id INT IDENTITY(1,1), DESCRIPTION VARCHAR(100))
INSERT INTO tempdb.dbo.temp SELECT ''1'' SELECT * FROM tempdb.dbo.temp'
PRINT (@sql)
EXEC (@sql)
SELECT * FROM tempdb.dbo.temp

DROP TABLE tempdb.dbo.temp

ラージ

于 2013-01-30T09:22:45.720 に答える
0

動的クエリで一時テーブルを作成するには、これをチェックしてください

DECLARE @sql VARCHAR(200)
SET @sql = 'CREATE TABLE #temp(id INT IDENTITY(1,1), DESCRIPTION VARCHAR(100))
INSERT INTO #temp SELECT ''1'' SELECT * FROM #temp'
PRINT (@sql)
EXEC (@sql)

SQLフィドル

正確に言うと

DECLARE @sql VARCHAR(1000)
SET @sql = 
    'DECLARE @Temp TABLE (
                Id INT,
                etc
                INSERT INTO @Temp (Id, etc)
                SELECT Id,
                etc
                FROM [databasename].dbo.TableName / / hardcoded
                WHERE ....... SELECT * FROM @temp'

    PRINT (@sql)
EXEC (@sql)
于 2013-01-30T08:57:41.720 に答える