2009-12-04 19 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不“”或空