2012-11-07 12 views
1

我有一個表應該在表LanguageText中具有相應記錄的項目。 LanguageText的ID(標識)在我的Items表中的Items.LanguageTextId字段中註冊。使用合併語句在插入目標後使用標識更新源表中的字段

我想完成的是在Items.LanguageTextId中所有帶有null的記錄的LanguageText和Items之間的合併,並將這些Item記錄的itemname/text插入到LanguageText中,並使用新插入的LanguageText中的ID值更新LanguageTextId記錄(SCOPE_IDENTITY()?)

插入正常工作:

MERGE [dbo].[LanguageText] AS target 
USING (SELECT [Items].* from [dbo].Items) AS source 
ON (TARGET.Id = SOURCE.LanguageTextId) 
WHEN NOT MATCHED By Target THEN 
    INSERT 
     ([Text]) 
VALUES 
     (source.[ItemName]); 

但我不知道如何更新我的items.Languagetextid,我可以做一些事情: OUTPUT $操作,INSERTED.ID? 還是有更好的方法來完成這個?

由於提前,

邁克

+1

您可以使用輸出到您存儲在項目中的主鍵加上生成的ID inserted.id表變量。然後,您可以對來自項目主鍵上加入的表變量的項目進行更新。 –

回答

7

你可以做一個merge..output到表變量,然後更新。

SQL Fiddle

MS SQL Server 2008的架構設置

create table Items 
(
    ItemsId int identity primary key, 
    ItemName nvarchar(50) not null, 
    ItemsLanguageTextId int null 
); 

create table ItemsLanguageText 
(
    ItemsLanguageTextId int identity primary key, 
    Text nvarchar(50) not null 
); 

insert into Items values('Name 1', null); 
insert into Items values('Name 2', null); 
insert into Items values('Name 3', null); 

查詢1

declare @T table 
(
    ItemsId int, 
    ItemsLanguageTextId int 
); 

merge ItemsLanguageText as T 
using (
     select ItemsId, ItemName 
     from Items 
     where ItemsLanguageTextId is null 
    ) as S 
on 0 = 1 
when not matched then 
    insert (Text) values (S.ItemName) 
output S.ItemsId, inserted.ItemsLanguageTextId 
    into @T; 

update Items 
set ItemsLanguageTextId = T.ItemsLanguageTextId 
from @T as T 
where T.ItemsId = Items.ItemsId; 

Results

查詢2

select * from Items; 

Results

| ITEMSID | ITEMNAME | ITEMSLANGUAGETEXTID | 
-------------------------------------------- 
|  1 | Name 1 |     13 | 
|  2 | Name 2 |     14 | 
|  3 | Name 3 |     15 | 

查詢3

select * from ItemsLanguageText; 

Results

| ITEMSLANGUAGETEXTID | TEXT | 
-------------------------------- 
|     13 | Name 1 | 
|     14 | Name 2 | 
|     15 | Name 3 | 
+0

這真是太棒了Mikael,沒有想到這一點,謝謝! –

2

我想你要找的是什麼加時匹配。

例如

WHEN MATCHED THEN UPDATE SET.... etc etc 
WHEN NOT MATCHED THEN INSERT ... etc etc 

您可以查看本次合併交易文件,瞭解如何正確使用MERGE細節。 http://technet.microsoft.com/en-us/library/bb510625.aspx

+0

嗨Panagiotis,不,這不是我的意思。沒有匹配(ON(TARGET.Id = SOURCE.LanguageTextId),因爲Source.LanguageTextId始終爲空。我想要插入,獲取LanguageText的(新)標識並將其放入Items.LanguageTextId Regards,Mike –

+0

哦我明白你的意思,但是我看到的插入沒有爲新插入的記錄賦予一個Id ...只插入源碼。[ItemName]即時猜測是值。 有什麼我失蹤? –

+0

LanguageText表的ID字段是一個標識字段,自動遞增1.我希望將該值填充到Items表的LanguageTextID字段中 –

0

我仍然是一個noob,當涉及到SQL ...我想這不能與合併完成,所以我已經嘗試了存儲過程與遊標循環的記錄,並做我想要它做什麼:

CREATE PROCEDURE [dbo].[PM_CreateItemsLanguageTexts] 
AS 
DECLARE @ITEMNAME NVARCHAR(50); 
DECLARE @ITEMID BIGINT; 

BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

--Declare Cursor so we can iterate each record 
Declare c Cursor For Select Id, ItemName From dbo.Items WHERE NameId is null 
Open c 
--Fetch First 
Fetch next From c into @ITEMID, @ITEMNAME 

--As long as we are 'on a roll' go with the flow.. 
While @@Fetch_Status=0 
Begin 

    PRINT @ITEMNAME; 
    PRINT @ITEMID; 

    --FIRST INSERT A NEW TEXT RECORD IN ItemsLauguageText 
    INSERT dbo.ItemsLauguageText(Text) VALUES (@ITEMNAME);  

    --UPDATE THE ITEMS RECORD NAMEID FIELD WITH THE LATEST IDENTITY/ID VALUE 
    UPDATE dbo.Items SET NameID = CAST(SCOPE_IDENTITY() AS bigint) WHERE dbo.Items.Id = @ITEMID; 

Fetch next From c into @ITEMID,@ITEMNAME 
End 
End 

CLOSE C; 
DEALLOCATE C; 
相關問題