如何使用参数从存储过程返回null,empty和non-empty值

时间:2014-05-02 16:48:34

标签: tsql stored-procedures null optional-parameters

我正在使用SQL 2008R2。我有一个存储过程有56个可选参数。前端应用程序使用它来搜索表。许多列包含NULL或空字符串。 当申请通过'%'作为一个参数的值,sproc返回与列的所有非空值匹配的行。要求是返回所有非空和NULL匹配行(即所有行)。为了模拟它我有这个小例子代码:

-- table
declare @foobar table
(
column1 nvarchar(100)
, column2 nvarchar(100)
)

-- dummy data
insert into @foobar(column1, column2)
select '100', 'high' union
select '200', 'low' union
select '300', null union
select '400', 'medium' union
select '500', '' union
select '600', 'high' union
select '700', '' union
select '800', null

-- parameter
declare @column2 nvarchar(100)
set @column2 = '%'

-- This returns all non-null values.  
-- Requirement is to return all non-null and NULL values.
select column1, column2 from @foobar 
where (column2 like @column2 + '%' or nullif(@column2, '') is null)

/*

'%' returns all records where value is not null
Problem: Dev requires all values including null ones.
Thought about the followings:
1. Do a dynamic SQL based query and use sp_executesql:

    -- create the WHERE clause
    if @Column2 = '%'
    @WHERE = 'AND (column2 like @column2 OR column is null)'
    else
    @WHERE = 'AND column2 like @column2 OR nullif(@column2, '') is null)'
**/

我不喜欢动态查询(我只是懒惰)。但是,为此我一直在尝试动态查询和sp_executesql。我不确定是否可以使用56个参数创建动态查询,其中许多参数将为null(前端没有提供任何参数)。我只是想知道在没有使用动态查询的情况下是否有更好的方法。

2 个答案:

答案 0 :(得分:0)

您只需对where条款进行细微更改即可。

OR之前的第一部分会找到任何非空值。

仅当用户输入%

时,第二部分才会查找空值
(column2 like @column2 + '%' or (@column2 = '%' and column2 is null))

答案 1 :(得分:0)

怎么样

WHERE (column2 LIKE @column2 + '%' OR @column2 = '%')