1

すべての列をリストせずに、ソース (リンクされた Oracle サーバー) からターゲット テーブル (SQL Server 2012) に非常に広いテーブルをマージしようとしています。両方のテーブルは、それらのレコードを除いて同一です。これは私が使用しているものです:

TRUNCATE TABLE TargetTable
INSERT INTO TargetTable
SELECT *
FROM SourceTable

これが機能するとき/場合は、更新を行うために必要なソース、ターゲット、および一致キーを渡すことができるように、それを手順にしたいと思います。今のところ、私はそれをまったく機能させたいと思っています。

USE ThisDatabase  
GO

DECLARE
  @Columns VARCHAR(4000) = (
    SELECT COLUMN_NAME + ',' 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'TargetTable' 
    FOR XML PATH('')
    )

MERGE TargetTable AS T

USING (SELECT * FROM SourceTable) AS S
ON (T.ID = S.ID AND T.ROWVERSION = S.ROWVERSION)

WHEN MATCHED THEN 
  UPDATE SET @Columns = S.@Columns

WHEN NOT MATCHED THEN   
  INSERT (@Columns)
  VALUES (S.@Columns)

私の初心者を許してください。まだ半分しか進んでいないような気がしますが、SQL のいくつかの部分を十分に理解していないため、すべてをまとめることができません。どうもありがとう。

4

2 に答える 2

1

回答で前述したように、列を指定したくない場合は、動的クエリを作成する必要があります。あなたの場合、次のようなものが役立ちます:

DECLARE
@Columns VARCHAR(4000) = (
SELECT COLUMN_NAME + ',' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'TargetTable' 
FOR XML PATH('')
)

DECLARE  @MergeQuery NVARCHAR(MAX)
DECLARE  @UpdateQuery VARCHAR(MAX)
DECLARE  @InsertQuery VARCHAR(MAX)
DECLARE  @InsertQueryValues VARCHAR(MAX)
DECLARE  @Col VARCHAR(200)

SET @UpdateQuery='Update Set '
SET @InsertQuery='Insert ('
SET @InsertQueryValues=' Values('


WHILE LEN(@Columns) > 0
BEGIN
   SET @Col=left(@Columns, charindex(',', @Columns+',')-1);

   IF @Col<> 'ID' AND @Col <> 'ROWVERSION'
   BEGIN
      SET @UpdateQuery= @UpdateQuery+ 'TargetTable.'+ @Col + ' = SourceTable.'+ @Col+ ','
      SET @InsertQuery= @InsertQuery+@Col + ','
     SET @InsertQueryValues=@InsertQueryValues+'SourceTable.'+ @Col+ ','
   END

  SET @Columns = stuff(@Columns, 1, charindex(',', @Columns+','), '')
END

SET @UpdateQuery=LEFT(@UpdateQuery, LEN(@UpdateQuery) - 1)
SET @InsertQuery=LEFT(@InsertQuery, LEN(@InsertQuery) - 1)
SET @InsertQueryValues=LEFT(@InsertQueryValues, LEN(@InsertQueryValues) - 1)

SET @InsertQuery=@InsertQuery+ ')'+  @InsertQueryValues +')'

SET @MergeQuery=
N'MERGE TargetTable
USING SourceTable
ON TargetTable.ID = SourceTable.ID AND TargetTable.ROWVERSION =    SourceTable.ROWVERSION ' +

'WHEN MATCHED THEN ' + @UpdateQuery +
' WHEN NOT MATCHED THEN '+@InsertQuery +';'

Execute sp_executesql @MergeQuery

Merge の詳細については、この優れた記事をお読みください。

于 2015-04-16T05:50:55.023 に答える