我有这部分查询,我正在这样做。
FROM #Table2 WHERE Attribute = ISNULL('+@Attrb+', Attribute)) AS D
显然这对我不起作用,因为@Attr可以带来一个字符串或者可以为空。有没有更好的方法来处理这个? 我需要的是,这是一个传递给这个存储过程的参数。有两种可能的选择(或第三种是空的)。我允许用户输入。你会如何解决这个问题?
感谢。
答案 0 :(得分:1)
FROM #Table2 ' + ISNULL('WHERE Attribute = ''' + NULLIF(@Attrb,'') + '''', '') + ') AS D
示例强>
CREATE TABLE #Table2 (Attribute VARCHAR(MAX))
INSERT INTO #Table2 VALUES
('Id'),('Class'),('Name')
DECLARE @Attrb VARCHAR(MAX),
@SQL VARCHAR(MAX)
--Attrb is NULL
SET @SQL = ' SELECT * FROM #Table2 ' + ISNULL('WHERE Attribute = ''' + NULLIF(@Attrb,'') + '''', '')
EXEC(@SQL)
/*Result
Attribute
---------
Id
Class
Name
*/
--Give Attrb a value
SET @Attrb = 'Class'
SET @SQL = ' SELECT * FROM #Table2 ' + ISNULL('WHERE Attribute = ''' + NULLIF(@Attrb,'') + '''', '')
EXEC(@SQL)
/*Result
Attribute
---------
Class
*/
答案 1 :(得分:0)
您尚未指出您正在使用的SQL Server版本,但如果您使用的是2012或更高版本,则可能需要检查iif
测试示例:
declare @Attrib varchar(20)
set @Attrib = NULL
select iif(@Attrib is null,'Null Result',@Attrib)
答案 2 :(得分:0)
我不确定字符串文字在那里做了什么。我很确定你想要这样的东西。
WHERE Attribute = ISNULL(@Attrb, Attribute)
或者,如果您尝试处理NULL或空字符串,则可以使用NULLIF
WHERE Attribute = ISNULL(NULLIF(@Attrb, ''), Attribute)
- 编辑 -
修改它以使用动态sql非常简单。
'WHERE Attribute = ISNULL(NULLIF(' + ISNULL(@Attrb, Attribute) + ', ''''), Attribute)'