2009-12-04 58 views
0

我有一個需求,我需要看看這個密鑰是否已經存在。如果它已經存在更新基於關鍵字的數據,則只需插入新數據。爲什麼這種行爲與int在SQL Server 2005中

,我採取的方法是

DECLARE @Tracking_Id INT 
SELECT @Tracking_Id = Tracking_Id 
     FROM DOCUMENT_TRACKING 
     WHERE Secondary_Document_Id = @Secondary_Document_Id 
       AND primary_Document_Id = @Primary_Document_Id 

     IF (@Tracking_Id = 0) 
      BEGIN       
       INSERT INTO DOCUMENT_TRACKING 
         (
          Primary_Document_Id, 
          Secondary_Document_Id, 
          Tracking_Result, 
          Comment, 
          Created_By, 
          Created_Dt, 
          Updated_By, 
          Updated_Dt 
         ) 
       VALUES (
          @Primary_Document_Id, 
          @Secondary_Document_Id, 
          @TrackingResult, 
          @Comments, 
          @User_ID, 
          GETDATE(), 
          @User_ID, 
          GETDATE() 
         )  
      END  

     ELSE 
      BEGIN     
       SELECT @Tracking_Id = Tracking_Id 
       FROM DOCUMENT_TRACKING 
       WHERE Secondary_Document_Id = @Secondary_Document_Id 
         AND primary_Document_Id = @Primary_Document_Id 
       UPDATE DOCUMENT_TRACKING 
       SET  tracking_result = @TrackingResult, 
         Comment = @Comments, 
         Updated_By = @User_ID, 
         Updated_Dt = GETDATE() 
       WHERE Tracking_Id = @Tracking_Id   
      END 

現在,當存在與我的數據庫狀態沒有行,要麼@Tracking_Id必須是0或「」或空,但它說明不了什麼,當我比較一下與任何這些事情。

我不想使用計數方法,然後比較0或更大。我如何處理這個scenerio。

回答

1

可以使用

IF @@ROWCOUNT = 0 

看到一個選擇返回的行。

如果您正在使用空這樣比較

IF @var = NULL 

將永遠是假的,你應該比較喜歡:

IF @var IS NULL 
0

嘗試改變if語句

IF (ISNULL(@Tracking_Id,0) = 0) 

當沒有找到任何項目,@Tracking_Id爲空,並且不與0比較,所以它會進入else。

+0

沒有它不與isnull()一起使用。 – Rohit 2009-12-04 08:15:07

1

我想你應該更換

IF (@Tracking_Id = 0) 

IF (@Tracking_Id IS NULL) 

或使用

IF EXISTS(SELECT @Tracking_Id = Tracking_Id 
    FROM DOCUMENT_TRACKING 
    WHERE Secondary_Document_Id = @Secondary_Document_Id 
      AND primary_Document_Id = @Primary_Document_Id) 
BEGIN 
    UPDATE CODE HERE 
END 
ELSE 
BEGIN 
    INSERTION CODE HERE 
END 

或者另一種方法是如下

UPDATE Statement 
IF @@ROWCOUNT = 0 
BEGIN 
    INSERTION CODE 
END 

這個想法是系統地應用使用UPDATE語句。如果該行存在@@行數將是1

+0

如果(@Tracking_Id IS NULL)不起作用。這是我的擔憂。它沒有得到比較0,''或null。 – Rohit 2009-12-04 08:14:30

+0

IF EXISTS(SELECT @Tracking_Id = TRACKING_ID FROM DOCUMENT_TRACKING WHERE Secondary_Document_Id = @Secondary_Document_Id AND primary_Document_Id = @Primary_Document_Id) 給出了一個錯誤。我認爲你不能在IF中使用一個變量 – Rohit 2009-12-04 08:23:22

+0

使用__IF EXISTS(SELECT Tracking_Id FROM DOCUMENT_TRACKING WHERE Secondary_Document_Id = @Secondary_Document_Id AND primary_Document_Id = @Primary_Document_Id)__ – 2009-12-04 16:12:30

-2

我預計它返回null而不是零 - 你可以調整你的查詢這裏:

SELECT @Tracking_Id = ISNULL(Tracking_Id, 0) 
     FROM DOCUMENT_TRACKING 
     WHERE Secondary_Document_Id = @Secondary_Document_Id 
       AND primary_Document_Id = @Primary_Document_Id 
+0

Doesn不起作用 - 如果結果集中沒有行,那麼選擇列表中的表達式永遠不會被計算,因此@Tracking_Id仍然是NULL – 2009-12-04 08:05:28

0

查詢,如:「SELECT @variable =字段來自表「 不清除(空)@variable當@variable不爲空並且表中沒有記錄時。這有時會導致難以發現問題 我會建議使用: SET @Tracking_Id =(選擇TRACKING_ID FROM DOCUMENT_TRACKING WHERE Secondary_Document_Id = @Secondary_Document_Id AND primary_Document_Id = @Primary_Document_Id)

,或者使用「IF EXISTS (...)「就像拉吉寫的。

嘗試這種情況:

- 降臺試驗

創建臺試驗(ID整數)

插入到測試值(1)

插入到測試值(2)

declare @i integer set @ i = 123

選擇@i =從測試ID其中,ID = 3

選擇@i - < - @ I = 123 - 靜止(WOW :))

組@i =(選擇/ 頂部1從測試/ID其中,ID = 3)

選擇@i - < - 現在I = NULL,沒關係,你可以測試NULL

集@i =(選擇/ 前1/id from test where id = 1)

select @i - < - now @ I = 1

問候。

0
IF EXISTS(SELECT 1 
    FROM DOCUMENT_TRACKING 
    WHERE Secondary_Document_Id = @Secondary_Document_Id 
      AND primary_Document_Id = @Primary_Document_Id) 
BEGIN 

SELECT @Tracking_Id = Tracking_Id 
    FROM DOCUMENT_TRACKING 
    WHERE Secondary_Document_Id = @Secondary_Document_Id 
      AND primary_Document_Id = @Primary_Document_Id 

update here... 
END 
ELSE 
BEGIN 

insert here 

END 
0
if (select count(Tracking_Id) from DOCUMENT_TRACKING where [email protected]_Document_Id and [email protected]_Document_Id and Tracking_id>0)=0 
begin 

end 
else 
begin 

end 

基本上得到了多少記錄的查詢返回,然後比較計數,看它是否是0。> 0可確保TRACKING_ID不「」或空