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