2012-10-02 60 views
6

我有點卡住了爲什麼我無法用下面的語句獲得插入行的'新標識'。 SCOPE_IDENTITY()只是返回null。SQL Server OUTPUT子句

declare @WorkRequestQueueID int 
declare @LastException nvarchar(MAX) 
set @WorkRequestQueueID = 1 
set @LastException = 'test' 

set nocount off 

DELETE dbo.WorkRequestQueue 
OUTPUT 
     DELETED.MessageEnvelope, 
     DELETED.Attempts, 
     @LastException, 
     GetUtcdate(), -- WorkItemPoisened datetime 
     DELETED.WorkItemReceived_UTC 
    INTO dbo.FaildMessages 
FROM dbo.WorkRequestQueue 
WHERE 
    WorkRequestQueue.ID = @WorkRequestQueueID 

IF @@ROWCOUNT = 0 
    RAISERROR ('Record not found', 16, 1) 

SELECT Cast(SCOPE_IDENTITY() as int) 

任何援助將不勝感激。

現在我使用這樣的解決方法。

declare  @WorkRequestQueueID int 
declare @LastException nvarchar(MAX) 
set @WorkRequestQueueID = 7 
set @LastException = 'test' 

set nocount on 
set xact_abort on 

DECLARE @Failed TABLE 
(
    MessageEnvelope xml, 
    Attempts smallint, 
    LastException nvarchar(max), 
    WorkItemPoisened_UTC datetime, 
    WorkItemReceived_UTC datetime 
) 

BEGIN TRAN 

DELETE dbo.WorkRequestQueue 
OUTPUT 
    DELETED.MessageEnvelope, 
    DELETED.Attempts, 
    @LastException, 
    GetUtcdate(), -- WorkItemPoisened datetime 
    DELETED.WorkItemReceived_UTC 

INTO 
    @Failed 
FROM 
    dbo.WorkRequestQueue 
WHERE 
    WorkRequestQueue.ID = @WorkRequestQueueID 

IF @@ROWCOUNT = 0 BEGIN 
    RAISERROR ('Record not found', 16, 1) 
    Rollback 
END ELSE BEGIN 
    insert into dbo.FaildMessages select * from @Failed 
    COMMIT TRAN 
    SELECT Cast(SCOPE_IDENTITY() as int) 
END 

回答

3

你可以嘗試使用表變量爲您output條款,從而使您可以明確地插入FaildMessages

declare  @WorkRequestQueueID int 
declare @LastException nvarchar(MAX) 
set @WorkRequestQueueID = 1 
set @LastException = 'test' 

set nocount off 

    -- Declare a table variable to capture output 
    DECLARE @output TABLE (
     MessageEnvelope VARCHAR(50), -- Guessing at datatypes 
     Attempts INT,     -- Guessing at datatypes 
     WorkItemReceived_UTC DATETIME -- Guessing at datatypes 
    ) 

    -- Run the deletion with output 
    DELETE dbo.WorkRequestQueue 
    OUTPUT 
     DELETED.MessageEnvelope, 
     DELETED.Attempts, 
     DELETED.WorkItemReceived_UTC 
    -- Use the table var 
    INTO @output 
    FROM dbo.WorkRequestQueue 
    WHERE 
     WorkRequestQueue.ID = @WorkRequestQueueID 

    -- Explicitly insert 
    INSERT 
    INTO dbo.FaildMessages 
    SELECT 
     MessageEnvelope, 
     Attempts, 
     @LastException, 
     GetUtcdate(), -- WorkItemPoisened datetime 
     WorkItemReceived_UTC 
    FROM @output 


IF @@ROWCOUNT = 0 
    RAISERROR ('Record not found', 16, 1) 


SELECT Cast(SCOPE_IDENTITY() as int) 
+0

我到底做了什麼,歡呼 – Terry

3

EDITED FEB'2013

@MartinSmith提醒我們,這個bug don't want be fixed by Microsoft

「發佈Microsoft在2013年2月27日在下午2點18你好馬丁,我們 調查這個問題,並發現,改變行爲是不是 容易的事。這將基本上都需要進行一些重新定義鑑於問題的&常見的應用場景的性質 當兩個INSERT &輸出轉換成目標具有標識列的 行爲,我們有 決定不解決這個問題 - Umachandar,SQL可編程 隊」

EDITED OCT'2012

這是由錯誤造成的:

測試錯誤:

Quoting OUTPUT Clause doc

@@ IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT返回身份值 僅由嵌套的DML語句生成,而不是由生成的 外部INSERT語句。

測試1:

測試後,它似乎SCOPE_IDENTITY()只有當外部操作是表中插入帶有標識列的作品刪除

create table #t (a char(1)); 
create table #d (a char(1), i int identity); 

insert into #t 
values ('a'),('b'),('c'); 

delete #t 
output deleted.a into #d; 

select SCOPE_IDENTITY(), * from #d; 

    a i 
---- - - 
null a 1 
null b 2 
null c 3 

測試2:Inserting in outer table with identity

create table #t (a char(1), i int identity); 
create table #d (a char(1), i int identity); 

insert into #t 
values ('x'),('x'),('x'); 

insert into #t 
output inserted.a into #d 
values ('a'),('b'); 

select scope_identity(), * from #d; 

    a i 
- - - 
2 a 1 
2 b 2 

測試3:插入沒有標識的外表

create table #t (a char(1)); 
create table #d (a char(1), i int identity); 

insert into #t 
values ('x'),('x'),('x'); 

insert into #t 
output inserted.a into #d 
values ('a'),('b'); 

select scope_identity(), * from #d; 


    a i 
---- - - 
null a 1 
null b 2 
+5

@danihp - 即'OPTION(MAXDOP 1)'不工作的原因是因爲您在Connect上找到的錯誤報告與此不一樣。 [我在這裏創建了一個新的](https://connect.microsoft。com/SQLServer/feedback/details/765809/odd-behavior-of-scope-identity-with-insert-into) –

+0

這個Connect Item剛剛更新,說錯誤不會被修復...... –

+0

@MartinSmith,發佈更新,謝謝! – danihp