带位参数的存储过程

时间:2013-12-15 17:19:10

标签: sql stored-procedures

其中一个参数是Bit数据类型。虽然DB表中的值只是0和1,但是当从接口发送参数时,它也可以是null。这个人。查询给出0行。我怀疑这个位参数可能存在问题。

ALTER PROCEDURE GETDATA (@username  VARCHAR(50),
                         @profileid UNIQUEIDENTIFIER,
                         @status    BIT)
AS
  BEGIN
      IF @username = ''
        SET @username = NULL
      ELSE
        SET @username = '%' + @username + '%'

      IF @profileid = '00000000-0000-0000-0000-000000000000'
        SET @profileid = NULL

      SELECT u.*
      FROM   tbluser u
      WHERE  u.deleted = 0
             AND ( u.username like @username
                    OR u.username IS NULL )
             AND ( u.profileid = @profileid
                    OR u.profileid IS NULL )
             AND ( u.status = @status
                    OR ( @status IS NULL
                         AND u.status IS NULL ) )
  END

--execute GetData null,null,null

预期产出

UserId EmpId Username profileid status
--------------------------------------
 1      101   user1     10       1

2 个答案:

答案 0 :(得分:1)

status列的逻辑与其他两列不同,并且在传入NULL时总是会失败(因为您说数据库中的值始终为0和{ {1}})。

你真的想要这个逻辑吗?

1

这会将 WHERE u.deleted = 0 AND ( u.username = @username OR @username IS NULL ) AND ( u.profileid = @profileid OR @profileid IS NULL ) AND ( u.status = @status OR @status IS NULL ) 输入参数视为不对列进行任何过滤。

答案 1 :(得分:1)

您的手术存在很多问题。第一个是这个组合:

IF @username = ''
    SET @username = NULL
ELSE
    SET @username = '%' + @username + '%'

接着是

 u.username = @username

如果发送空值,则此代码将执行:

SET @username = '%' + @username + '%'

这将使@username = null,并且查询将崩溃,因为你没有

where somefield = null

你必须

where somefield is null

传递空字符串存在类似问题。现在,假设'fred'的值作为用户名传递。再一次,执行:

SET @username = '%' + @username + '%'

和此:

 u.username = @username

成为

 u.username = '%fred%'

你可能想要这个词而不是那里的等号。

对于@status变量,如果您的db没有空值,请不要查找任何值。如果你将一个传递给proc,你可能想要使用动态sql或case结构。这样的事情应该有效。

and u.status = case when @status is not null then @status
else u.status end