2016-08-08 25 views
0

我需要一點幫助。下面的存儲過程似乎沒有以往任何時候都匹配退出的唯一標識符存儲過程返回不正確的ID引導

ALTER PROCEDURE [dbo].[spInsertUpdateThisStuff] 
    @Id uniqueidentifier OUTPUT, 
    @Content nvarchar(255) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @tAudit table (id uniqueidentifier) 

    IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id) 
    -- UPDATE 
    BEGIN 
     UPDATE [dbo].[myData] 
     SET [ID] = @ID, 
      [Content] = @Content 
     OUTPUT inserted.[ID] INTO @tAudit 
     WHERE [ID] = @Id 

     SELECT id FROM @tAudit 
    END 
    ELSE 
    BEGIN 
     -- INSERT 
     SET @ID = NEWID() 

     INSERT INTO [dbo].CBData ([ID], [Content]) 
     OUTPUT inserted.[ID] INTO @tAudit 
     VALUES(@Id, @Content) 

     SELECT id FROM @tAudit 
    END; 

    SET @ID = (SELECT id FROM @tAudit); 
END 

的C#

cmd.Parameters.Add("@ID", SqlDbType.UniqueIdentifier).Value = (currentRecord.ID == null) ? Guid.Empty : currentRecord.ID; 
cmd.Parameters["@ID"].Direction = ParameterDirection.Output; 
cmd.ExecuteNonQuery(); 
currentRecord.ID = Guid.Parse(cmd.Parameters["@ID"].Value.ToString()); 

看來第一個IF語句不以往任何時候都成爲真正的,但如果測試(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id)用它匹配的UID會返回數據。

+0

你怎麼知道它永遠不會返回TRUE;?它總是最終插入一個新的記錄? –

+0

是的,這是發生了什麼事。 – rdm

回答

1

這種說法是有問題的,,

DECLARE @tAudit table (id uniqueidentifier) 
    IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id) 
    -- UPDATE 
     BEGIN 

@id是一個輸出參數,併爲空默認情況下,你正試圖檢查..

基本上NEWID()不會被複制,所以更新部分是多餘的

+0

那麼爲什麼它不能識別來自@ID的內部數據呢?我將如何緩解這一點?我應該使用另一個變量作爲傳出數據到@ID還是另一個最佳實踐來處理這個問題。 – rdm

+0

如果你的目的是檢查你要插入的newid()是否存在,你可以忽略這個 – TheGameiswar

+0

目的是測試@ID的內容,看它是否存在於數據庫中,然後更新如果它存在並插入,如果它不。 – rdm

0

你如何在代碼中聲明參數?是ParameterDirection.Output

嘗試將其更改爲ParameterDirection.InputOutput。你的SQL看起來沒問題。而你可以將一個輸入值傳遞給存儲過程中聲明爲OUTPUT的參數。所以也許這只是ParameterDirection

你也可以改變這個

IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id) 

IF @Id IS NOT NULL AND EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @Id) 

如果你的ID列不可爲空,然後它會工作相同兩種方式。但是這更明確一些,表明它已經被認識到@Id可能是空的,因爲它是一個OUTPUT參數。

0

這是我的修復程序。 這是我的新的存儲過程

ALTER PROCEDURE [dbo].[spInsertUpdatemyData] 
    @ID uniqueidentifier, 
    @IDOut uniqueidentifier OUTPUT, 
    @CONTENT nvarchar(255) 
AS 

BEGIN 
    --SET NOCOUNT ON; 
    DECLARE @tAudit table (outputID uniqueidentifier) 
    IF EXISTS(SELECT * FROM [dbo].[myData] WHERE [ID] = @ID) 
    -- UPDATE 
     BEGIN 
      UPDATE [dbo].[CBData] 
      SET  [ID] = @ID, 
        [Content] = @Content 
      OUTPUT inserted.[ID] INTO @tAudit 
      WHERE [ID] = @ID 
     SELECT outputID FROM @tAudit; 
      END 
    ELSE 
     BEGIN 
    -- INSERT 
     INSERT INTO [dbo].myData 
       ([ID],[Content]) 
      OUTPUT inserted.[ID] INTO @tAudit 
      VALUES(NEWID(),@Content); 
      SELECT outputID FROM @tAudit 
     END; 
     set @IDOut = (SELECT outputID FROM @tAudit); 
END 

,相對C#

//Add Parameter for output to sql command then Change Direction of parameter 
cmd.Parameters.Add("@IDOut", SqlDbType.UniqueIdentifier).Value = Guid.Empty ; 
cmd.Parameters["@IDOut"].Direction = ParameterDirection.InputOutput; 
cmd.ExecuteNonQuery(); 
currentRecord.ID = Guid.Parse(cmd.Parameters["@IDOut"].Value.ToString()); 
cmd.Transaction.Commit();