我正在使用 SQL Server 2000,并且遇到了一个关于 SQL 代码块的奇怪问题(如下):
用户可以输入“GM”作为可能的参数或“F”。如果用户在存储的 proc 查询字符串中输入“GM”作为参数,我需要 AutoDivision 包括 GMC、CAD、CHE、SAT
declare @AutoDivision as varchar(15)
set @AutoDivision = 'GM'
if @AutoDivision = 'GM'
Begin
Select @AutoDivision = '''Cad'', ''GMC'', ''Sat'', ''Che'''
End
SELECT
oh.OrderNumber, lg.[lgh_number]
FROM
[dbo].[OrderHeader] oh (NOLOCK)
INNER JOIN
[dbo].[DistrctHeader] lg (NOLOCK) ON oh.[inv_number] = lg.[inv_number]
INNER JOIN
[dbo].[DealerCompany] c (NOLOCK) ON c.cmp_id = LEFT(oh.[ordernumber],3)
INNER JOIN
[dbo].[divisionXREF] x (NOLOCK) ON x.Division = c.comp_revtype
WHERE
oh.ord_number = '113-889257'
AND x.AutoDivision IN (@AutoDivision)
--AND x.AutoDivision IN ('Cad', 'Sat', 'GMC', 'Che')
AND lg.[lgh_outstatus] IN ('AVAIL', 'PLAN', 'DISP', 'STRTD', 'PEND','COMP')
但是,当我运行下面的代码时,我没有取回任何记录。
当我取消注释代码行时
--AND x.AutoDivision IN ('Cad', 'Sat', 'GMC', 'Che')
它有效(我得到了一条记录返回)。
当我做
print 'AND x.AutoDivision IN (' + cast(@AutoDivision as varchar) + ')'
我回来了AND x.AutoDivision IN ('Cad', 'GMC', 'Sat', 'Che')
我在这里想念什么?
最佳答案
您不能使用单个变量来表示 SQL 中的 IN 参数的逗号分隔列表 - Oracle、MySQL、SQL Server ......没关系。
要使这个变量方法起作用,您需要使用动态 SQL,以便能够首先将查询创建为字符串(使用连接从变量中获取 IN 参数),然后执行查询语句:
DECLARE @cmd VARCHAR(1000)
SET @cmd = 'SELECT oh.OrderNumber,
lg.[lgh_number]
FROM [dbo].[OrderHeader] oh (NOLOCK)
JOIN [dbo].[DistrctHeader] lg (NOLOCK) ON oh.[inv_number] = lg.[inv_number]
JOIN [dbo].[DealerCompany] c (NOLOCK) ON c.cmp_id = LEFT(oh.[ordernumber],3)
JOIN [dbo].[divisionXREF] x (NOLOCK) ON x.Division = c.comp_revtype
WHERE oh.ord_number = '113-889257'
AND x.AutoDivision IN ('+ @AutoDivision +')
AND lg.[lgh_outstatus] IN (''AVL'', ''PLN'', ''DSP'', ''STD'', ''PND'',''CMP'') '
EXEC(@cmd)
我推荐阅读The Curse and Blessings of Dynamic SQL在实现动态 SQL 解决方案之前。
表值函数
一个 table valued function would allow you do what you want without using dynamic SQL -- there's more info in this article .
关于使用带有动态数据的 "IN"关键字的 SQL 语法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4455005/