sql isnull with string as option

时间:2016-01-07 19:27:18

标签: sql-server stored-procedures

我有这部分查询,我正在这样做。

FROM #Table2 WHERE Attribute = ISNULL('+@Attrb+', Attribute)) AS D

显然这对我不起作用,因为@Attr可以带来一个字符串或者可以为空。有没有更好的方法来处理这个? 我需要的是,这是一个传递给这个存储过程的参数。有两种可能的选择(或第三种是空的)。我允许用户输入。你会如何解决这个问题?

感谢。

3 个答案:

答案 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)'