我在where子句中使用了两个参数。当我通过这两个参数时,它们会给我带来预期的结果。但是当我传递NULL时,它不起作用。
以下是我尝试做的一个例子。
CREATE TABLE #Teste (Par1 VARCHAR(20), Par2 VARCHAR(20), Par3 VARCHAR(20), Par4 VARCHAR(20))
INSERT INTO #Teste
SELECT 'Luciana', NULL, '123456', 'SP'
UNION
SELECT 'Henrique', 'Souza', NULL, 'RJ'
UNION
SELECT NULL, NULL, '768949', 'BA'
UNION
SELECT 'Luis', 'Alberto', '123456', NULL
DECLARE @Par1 VARCHAR(20) = 'Lu'
DECLARE @Par2 VARCHAR(20) = NULL
DECLARE @SQL NVARCHAR(MAX) = ''
SET @SQL =
'SELECT * FROM #Teste WHERE (Par1 LIKE ''%' + @Par1 + '%'' OR @Par1 IS NULL)
OR (Par2 LIKE ''%' + @Par2 + '%'' OR @Par2 IS NULL)'
EXEC sp_executesql @SQL, N'@Par1 VARCHAR(20), @Par2 VARCHAR(20)', @Par1, @Par2;
当我通过' Souza' AS @ Par2它返回3行。但是当@ Par2 IS NULL没有返回任何东西时。它应该从@ Par1返回值。正确?
答案 0 :(得分:3)
如果您要使用参数,请保持一致:
SET @SQL = '
SELECT *
FROM #Teste
WHERE (Par1 LIKE ''%'' + @Par1 + ''%'' OR @Par1 IS NULL) OR
(Par2 LIKE ''%'' + @Par2 + ''%'' OR @Par2 IS NULL)
'
EXEC sp_executesql @SQL,
N'@Par1 VARCHAR(20), @Par2 VARCHAR(20)',
@Par1, @Par2;
当您将@Par1
或@Par2
设置为NULL
时,生成的查询字符串为NULL
- 正如您已定义的那样。
答案 1 :(得分:0)
做
DECLARE @Par2 VARCHAR(20) = NULL
整个@SQL
变为NULL
SET @SQL =
'SELECT * FROM #Teste WHERE 1=1 '
+ CASE WHEN @Par1 IS NOT NULL AND @Par2 IS NOT NULL THEN
' AND (@Par1 LIKE ''%' + @Par1 + '%'''
+ ' or @Par2 LIKE ''%' + @Par2 + '%'')'
ELSE
+ CASE WHEN @Par1 IS NOT NULL THEN ' AND @Par1 LIKE ''%' + @Par1 + '%''' ELSE '' END
+ CASE WHEN @Par2 IS NOT NULL THEN ' AND @Par2 LIKE ''%' + @Par2 + '%''' ELSE '' END
end
EXEC sp_executesql @SQL,
N'@Par1 VARCHAR(20), @Par2 VARCHAR(20)',
@Par1, @Par2;
因为OR
你应该检查每一种可能的方式
当Par1
或Par2
为空时,它不会添加到where
子句