null作为参数不起作用

时间:2017-10-03 01:47:14

标签: sql sql-server tsql

我在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返回值。正确?

2 个答案:

答案 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你应该检查每一种可能的方式

Par1Par2为空时,它不会添加到where子句