2012-10-02 13 views
6

मैं थोड़ा सा अटक गया हूं कि मुझे नीचे दिए गए कथन के साथ डाली गई पंक्ति की 'नई पहचान' क्यों नहीं मिल रही है। SCOPE_IDENTITY() बस शून्य लौटाता है।एसक्यूएल सर्वर आउटपुट खंड

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

आप इस प्रकार आप स्पष्ट रूप से FaildMessages में डालने के लिए अनुमति देता है अपने output खंड के लिए एक मेज चर का उपयोग करने की कोशिश कर सकते हैं,:

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

संपादित FEB'2013

@MartinSmith इस बग don't want be fixed by Microsoft कि हमें सचेत करता है।

"पर 2:18 PM सुस्वागतम् मार्टिन 2013/02/27 पर माइक्रोसॉफ्ट द्वारा प्रकाशित किया गया था, हम संबंधी समस्या की जांच की और पाया कि व्यवहार को बदलने करने के लिए एक आसान बात नहीं है। यह मूल रूप से कुछ को पुनर्परिभाषित करने की आवश्यकता होती है होगा । व्यवहार जब दोनों सम्मिलित & आउटपुट लक्ष्य में पहचान कॉलम के समस्या & असामान्य परिदृश्य की प्रकृति को देखते हुए, हम इस मुद्दे को ठीक नहीं करने का फैसला किया है -। Umachandar, एसक्यूएल Programmability "

टीम

संपादित OCT'2012

यह एक बग के कारण होता है:

परीक्षण बग:

Quoting OUTPUT Clause doc:

@@ पहचान, SCOPE_IDENTITY, और IDENT_CURRENT वापसी पहचान मान केवल नेस्टेड डीएमएल कथन द्वारा उत्पन्न होता है, और जो उत्पन्न नहीं होते हैं बाहरी 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 - कारण यह है कि 'विकल्प (MAXDOP 1)' काम नहीं करता है ऐसा इसलिए है क्योंकि कनेक्ट पर मिली बग रिपोर्ट इस तरह की नहीं है। [मैंने यहां एक नया बनाया है] (https://connect.microsoft।कॉम/एसक्यूएल सर्वर/फीडबैक/विवरण/76580 9/अजीब-व्यवहार-का-दायरा-पहचान-सम्मिलित-इन-इन) –

+0

यह कनेक्ट आइटम बस यह कहने के लिए अपडेट किया गया था कि बग ठीक नहीं किया जाएगा ... –

+0

@ मार्टिनस्मिथ, अद्यतन पोस्ट, धन्यवाद! – danihp

संबंधित मुद्दे