If或Case在动态where子句中

时间:2013-02-06 21:02:22

标签: sql sql-server-2008 if-statement case

在SQL Server 2008上,我有一个变量@storename,它是一个varchar(20)和这个语句:

SET @query = 'select '+@result1+' '+@colsNull+' into ##tempz 
FROM
(SELECT '+@result2+'
FROM rpPay p LEFT JOIN RPTrs r ON p.ReceiptNo = r.receiptno LEFT JOIN Currencies c ON LEFT(p.paytype,1) = c.POSCurrency
WHERE r.trsdate >= '''+ convert(varchar(10), @startDate, 101) +''' 
AND r.trsdate <= '''+ convert(varchar(10), @endDate, 101) +''' 
) p
pivot
(sum(amount) FOR CurrencyDesc in('+@cols+')) piv'
execute(@query)

我正在尝试将where子句设置为所有StoreID或@storename具有的内容。我可以在那里有一个IF或案例陈述或类似

and r.StoreID = * or r.StoreID = @storename

在where子句中使用通配符是否有这样的事情?

现在我已经尝试过:

declare @storename varchar(20)
set @storename = '01'

and ('+@storename+' is null or r.storeId = '+@storename+') -- Error : Conversion failed when converting the varchar value 'BK' to data type int.
and r.StoreID like '+@storename+' -- Returns no information, just blank table

也刚试过

declare @storename varchar(20)
set @storename = '01'
and r.storeid = '''+@storename+'''

哪个可以正常工作并从商店01返回所有内容但是如果我放

set @storename = null -- Gives me invalid Object name for the temp table I'm using
set @storename = '' -- give back no results again, just empty table

4 个答案:

答案 0 :(得分:0)

不,但您可以尝试: -

AND ( @storename IS NULL OR r.StoreID = @storename )

答案 1 :(得分:0)

您可以使用NULL @storename来表示“所有记录”。

declare @storenameComparisonValue varchar(50)
set @storenameComparisonValue =
        isnull(cast(replace(@storename, '''', '''''') as varchar(50)), 'null')
' ... and (' + @storenameComparisonValue + ' is null or r.StoreID = '''
        + @storenameComparisonValue + ''')

答案 2 :(得分:0)

r.storeId = '+@storename+')

storeId是一个int,@ storename是一个varchar,所以你无法比较它们。

and r.StoreID like '+@storename+'

storeID是一个i​​nt,所以你不能对它做LIKE。

您可能需要将@storename转换为int或重构数据库,因此StoreID是varchar,因此它们匹配。

答案 3 :(得分:0)

使用

  

和r.storeid之类的''%'+ @ storename +'%''