1

不确定这是否是最好的方法,但我有一个带有 OUTPUT 参数的存储过程,如下所示;

create procedure [dbo].[sp_get_site_idx]
@site_name varchar(100),
@result uniqueidentifier output
as
begin
  select @result = [primary_idx_col] from [site] where upper([site].[site_name]) = upper(@site_name);
  if (@result is null)
  begin
    < insert a new row>
    < run the above select statement again>
  end;
end;

当提供@site_name我知道不存在的 a 时,条件(@result is null)永远不会为真,实际上@result似乎是未定义的(类似于编程语言中存在异常时)。

[site]创建为:

create table [site] (
[primary_idx_col] UNIQUEIDENTIFIER DEFAULT NEWID() constraint pk_site_pk primary key,
...
);

select奇怪的是,如果我将语句稍微修改为:

select @result = [primary_idx_col] from [site] where upper([site].[site_name]) = upper(@site_name) group by [primary_idx_col];

然后(@result is null)将评估为真。

请问你能解释一下这种行为吗?第一条select语句有什么用?提前致谢。

4

1 回答 1

0

可以对照 NULL 检查 UNIQUEIDENTIFIER。

我尝试将您的代码放入测试数据库,并且逻辑似乎对我有用。

如果我用以下方式调用您的存储过程:

DECLARE @RESULT2 UNIQUEIDENTIFIER;
EXEC dbo.SP_GET_SITE_IDX @SITE_NAME = '<INSERT VALUE HERE>', -- varchar(100)
    @RESULT = @RESULT2 OUTPUT;-- uniqueidentifier
SELECT @RESULT2

然后我会根据站点名称是否在表中得到正确的结果。

它不会在过程中在您的 IF 中插入该行吗?

您确定有问题的网站不在您的表格中吗?

该站点可能在您的表中,但具有 NULL 键/值?

于 2013-10-24T11:23:28.003 回答