0

ExecSQL Server 2000 に、リンク サーバーからローカル データベースへの一括挿入を実行する一連のステートメントを実行するストアド プロシージャがあります。リンク サーバーは SQL Server 2012 インスタンスです。

これは手順のサンプルです:

Create Procedure CopyData(@LinkedServerName Varchar(10), @LinkedServerDatabase Varchar(20)) 
AS
BEGIN
    exec ('delete from table ConcernedTable')
    exec ('delete from table b')
    exec ('delete from table c')
    exec ('delete from table d')
.
.   
.
    exec ('delete from table z')

    exec ('insert into ConcernedTable select * from ['+@LinkedServerName+'].['+@LinkedServerDatabase+'].[dbo].ConcernedTable')
    exec ('insert into b select * from ['+@LinkedServerName+'].['+@LinkedServerDatabase+'].[dbo].b')
    exec ('insert into c select * from ['+@LinkedServerName+'].['+@LinkedServerDatabase+'].[dbo].c')
    exec ('insert into d select * from ['+@LinkedServerName+'].['+@LinkedServerDatabase+'].[dbo].d')
.
.
    exec ('insert into z select * from ['+@LinkedServerName+'].['+@LinkedServerDatabase+'].[dbo].z')
END

ConcernedTableSQL Server 2012 に 100,000 行のテーブル ( ) がありますが、Execステートメントを実行して SQL Server 2012 から SQL Server 2000 を選択すると、12,768 行しか挿入されません。

クエリにバグがあると思っていましたが、そうではありません。別のクエリ ウィンドウで同じExecステートメントを実行すると、100,000 行すべてが挿入されます。さらに奇妙なことは、以下に示すようexecに my のステートメントの位置を切り替えると、100,000 行すべてが挿入されることです。ConcernedTable

Create Procedure CopyData(@LinkedServerName Varchar(10), @LinkedServerDatabase Varchar(20)) 
AS
BEGIN
    exec ('delete from table b')
    exec ('delete from table c')
    exec ('delete from table d')
.
.   
.
    exec ('delete from table z')
    exec ('delete from table ConcernedTable')


    exec ('insert into b select * from ['+@LinkedServerName+'].['+@LinkedServerDatabase+'].[dbo].b')
    exec ('insert into c select * from ['+@LinkedServerName+'].['+@LinkedServerDatabase+'].[dbo].c')
    exec ('insert into d select * from ['+@LinkedServerName+'].['+@LinkedServerDatabase+'].[dbo].d')
.
.   
.
    exec ('insert into z select * from ['+@LinkedServerName+'].['+@LinkedServerDatabase+'].[dbo].z')
    exec ('insert into ConcernedTable select * from ['+@LinkedServerName+'].['+@LinkedServerDatabase+'].[dbo].ConcernedTable')
END

Linkedserver 名と Database 名の変数を作成する理由は、複数のリンク サーバーが存在するため、サーバーごとに同じステートメントを作成したくないからです。

Execステートメントを間違って使用していますか、またはexec次の行に移動する前にすべての行が挿入されるようにするために、後で行う必要があることはありますか?

4

0 に答える 0