2011-06-20 48 views
0

我不明白爲什麼使用scope_identity()的這個多表插入(存儲過程)不起作用。這是它的要點(此處原諒想象力命名,請):SQL Server Scope_Identity()使用問題

enter image description here

表B的ROWID列顯然是一個int,而不是設置爲身份自動遞增或類似的東西。

如果我在管理工作室運行它,它說1行受到影響,但它不會執行插入操作。

如果我從代碼運行它,我得到一個錯誤,說我不能在TableB,RowID中插入NULL值,這是正確的,它有一個非空約束。但它應該從第一個表獲取scope_identity()。

我已經嘗試過它進出交易和各種參數初始化...這是在殺我。預先感謝您的幫助。

回答

1

我假設tableA在數列上設置了一個IDENTITY?如果沒有

的 「1行受影響」 是不是從這個INSERT成TABLEA任

SCOPE_IDENTITY()將是NULL。

+0

TableA主鍵是一個自動遞增的int。對不起,把那部分拿出來。我讀過scope_identity的數字結果可以分配給一個int參數。 – theog

+0

@theog:腳本表,請添加到您的問題。添加檢查這個問題是確定數據類型的地方... http://stackoverflow.com/q/6414700/27535 – gbn

1

您在此處顯示的代碼沒有任何問題。我認爲當你簡化你的示例時,你已經刪除了有問題的代碼。

試試這個。

declare @TableA table (IDA int identity primary key, ColA int) 
declare @TableB table (IDB int primary key, ColB int) 

declare @RecordID int = 0, 
     @Val1 int 

if @RecordID = 0 
    begin 
    declare @NewID int 

    insert into @TableA values (@Val1) 
    set @NewID = scope_identity() 

    insert into @TableB values (@NewID, @Val1) 
    end 
else 
    begin 
    print 'Do something else' 
    end 

select * 
from @TableA, @TableB 

結果:

IDA   ColA  IDB   ColB 
----------- ----------- ----------- ----------- 
1   NULL  1   NULL 

把它兜風自己。 http://data.stackexchange.com/stackoverflow/q/103697/using-scope-identity

+0

好吧,地獄的鐘聲,即使這沒有找到我的問題,找到關於stackexchange數據分析器工具是值得的!我不知道那裏 - 非常酷。 – theog

1

另一個需要注意的是在表上是否有觸發器(特別是INSTEAD OF觸發器),這可能導致記錄無法插入。

您可以添加一個print語句來查看@newId變量的值,在初始化它後查看它是否爲null或它是否有值。

嘗試使用顯式事務和try catch塊,然後你可以看到你在catch塊中得到了什麼錯誤,如果它沒有超過第一次插入。

+0

我確實在尋找觸發器,但好點。在打印語句上進行故障排除也是一個好主意。謝謝! – theog