Sql server 为什么在SQLServer2005中使用int会出现这种行为

Sql server 为什么在SQLServer2005中使用int会出现这种行为,sql-server,sql-server-2005,Sql Server,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

我有一个需求,我需要查看该密钥是否已经存在。如果已经存在,请根据密钥更新数据,否则只需插入新数据

我采取的方法是

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或null,但当我将其与这些内容进行比较时,它不会显示任何内容

我不想使用计数方法,然后与0或大于0的值进行比较。我该如何处理这种情况

您可以使用

IF @@ROWCOUNT = 0
要查看由select返回的行,请执行以下操作

如果您以这种方式与null进行比较

IF @var = NULL
将始终为假,您应该进行如下比较:

IF @var IS NULL

尝试将if语句更改为

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

如果找不到任何项目,@Tracking\u Id为空,并且不与0比较,因此它将进入else。

我认为您应该替换它

 IF ( @Tracking_Id = 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)
BEGIN
    UPDATE CODE HERE
END
ELSE
BEGIN
    INSERTION CODE HERE
END
或者另一种选择如下

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

其思想是系统地应用UPDATE语句。如果行存在@@rowcount将为1。

我预测它将返回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 

查询方式:从表中选择@variable=field 当@variable不为null且表中没有记录时,不清除null@variable。它有时会导致难以发现的问题 我建议使用: 设置@Tracking\u Id=选择Tracking\u Id 从文档跟踪 其中Secondary\u Document\u Id=@Secondary\u Document\u Id 和primary_Document_Id=@primary_Document_Id

或使用,如果存在。。。就像拉杰写的

试试这个:

-跌落台试验

创建表测试id整数

插入测试值1

插入测试值2中

声明@i整数 设置@i=123

从id=3的测试中选择@i=id

选择@i-
本质上获取查询返回的记录数,然后比较是否为0。>0确保跟踪id不存在或不为null

有效-如果结果集中没有行,则永远不会计算选择列表中的表达式,因此如果@Tracking\u id为null不起作用,@Tracking\u id仍然为null。这是我关心的问题。未将其与0、0或null进行比较。如果存在,请从文档跟踪中选择@Tracking\u Id=Tracking\u Id,其中次要文档Id=@Secondary\u DOCUMENT\u Id和主要文档Id=@primary\u DOCUMENT\u Id会给出错误。我认为如果存在,则不能在内部使用变量。如果存在,请从文档跟踪中选择跟踪Id,其中二级文档Id=@Secondary\u DOCUMENT\u Id=@primary\u DOCUMENT\u Id=@primary\u DOCUMENT\u Id\uu没有为IF EXISTS中的变量赋值。。。
SELECT  @Tracking_Id = ISNULL(Tracking_Id, 0)
        FROM    DOCUMENT_TRACKING
        WHERE   Secondary_Document_Id = @Secondary_Document_Id
                AND primary_Document_Id = @Primary_Document_Id 
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
    if (select count(Tracking_Id) from DOCUMENT_TRACKING where Secondary_Document_Id=@Secondary_Document_Id and primary_Document_Id=@Primary_Document_Id and Tracking_id>0)=0
begin

end
else
begin

end