使用带有动态数据的 "IN"关键字的 SQL 语法问题

标签 sql sql-server tsql sql-server-2000 subquery

我正在使用 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/

相关文章:

sql-server - T-SQL : sp_depends with a cursor

sql-server - 为什么我不能比较这些十六进制值?

MySQL 列搜索逗号分隔的项目 - FIND_IN_SET 或 LIKE

使用 INSERT 时 SQL Server 转换失败

mysql - 按月分组并显示每个月对应的值

python - 将 FreeTDS 与 Django 结合使用

SQL Server 2012 : function get position of given string and then get string of given position

MySQL左连接和选择

c# - SQL插入命令只在一个循环中工作一次

mysql - 从 MSSQL 转换为 MySQL