其中一个参数是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
答案 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