7
DECLARE @t2 AS TABLE(id INT)  

INSERT INTO dbo.EntityMaster
        (EntityType)
OUTPUT INSERTED.EntityId INTO @t2
SELECT 'G' FROM #tmp

#tmpxmlからロードされたデータを含む一時テーブルです。EntityIdに含まれるレコードごとに生成する必要があり#tmpます。これは、最初にレコードをテーブルに挿入してから、このエンティティIDを各レコードEntityMasterに挿入し直すことで実行できます。#tmp

レコードをに挿入する代わりに、レコードごと@t2に更新する必要があります。#tmp

可能性はありますか?

4

2 に答える 2

1

このようなことを試してみてください。それでも一時テーブルを使用する必要がありますが、読むのにそれほど悪くはなく、仕事は完了します。

CREATE TABLE #tmp
((
    tmpID INT IDENTITY(1,1)プライマリキーがクラスター化され、
    xmlData VARCHAR(255)、
    EntityId INT
)。
@t2テーブルを宣言する
((
    tmpID INT、
    EntityId INT
)。

MERGE dbo.EntityMaster AS EM
使用する
((
    SELECT tmpID、
        xmlData、
        EntityId
    FROM #tmp
)AS X
    ON EM.EntityId = X.EntityId
一致しない場合
    INSERT(EntityType)
    値(X.xmlData)
出力X.tmpID、INSERTED.EntityId
INTO @ t2(tmpID、EntityId);

更新T
SET EntityId = T2.EntityId
FROM @ t2 T2
内部結合#tmpT
    ON T2.tmpID = T.tmpID

于 2012-10-01T13:18:35.040 に答える
0

#tmpこれは、XMLレコードをテーブルに挿入するSQLで簡単に実行できます。

次の@recs表について考えてみます。これは、XMLから生成された一連のレコードと考えることができます。

declare @recs table (val varchar(255))
insert into @recs values ('this'), ('is'), ('a'), ('test')

次のように、各レコードに増分整数を簡単に追加できます。

select row_number() over (order by (select 1)) as id, val from @recs

結果は次のようになります。

id  val
1   this
2   is
3   a
4   test

row_number() over (order by (select1))レコードが挿入されると同時に必要なIDを生成するために使用できます#tmpか?

于 2012-09-13T21:53:11.577 に答える