在()运算符不工作

时间:2016-09-06 10:22:47

标签: sql sql-server sql-server-2008 tsql

我是SQL新手。在做研究时,我发现问题如下所示。

当我执行查询时,我得到输出125,130,131。我将该输出存储在@issueid变量中。

declare @issueid varchar(100) 

set @issueid = (
    SELECT STUFF(
            (
                SELECT ','+convert(varchar,ism_id )
                FROM table where ism_group_name='TEST_COPY'
                FOR XML PATH('')
            ) ,1,1,'')) 

但是当我在下面的查询中使用@issueid变量时,我得到了奇怪的行为:

  • 如果我通过@issueid='125',我会得到结果
  • 如果我通过@issueid='125,130,131',则表示没有输出。

我的查询:

SELECT * 
FROM 
    ISSUE_MASTER (NOLOCK), 
    ORDER_ENTRY_PPDI (NOLOCK) 
WHERE ISM_ID= OE_ISSUE_ID 
    and ism_id=oe_issue_id 
    and convert(varchar,oe_issue_id) in (@issueid) 
    AND ISM_STATUS = 0
GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID

请帮忙!我做错了什么?

1 个答案:

答案 0 :(得分:1)

您可以针对该特定问题使用动态SQL,但正如@Aquillo所评论的那样,这不是一个好方法。最好将第一个表与您需要的表连接起来,而不要使用逗号分隔的参数:

SELECT  im.*,
        oe.*
FROM ISSUE_MASTER im (NOLOCK), 
INNER JOIN ORDER_ENTRY_PPDI oe (NOLOCK) 
    ON im.ISM_ID= oe.OE_ISSUE_ID  
INNER JOIN [table] t
    ON oe.oe_issue_id = t.ism_id
WHERE ISM_STATUS = 0  
    AND ism_group_name='TEST_COPY'
GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID

另一个解决方案是在XML的帮助下将@issueid转换为表格并最终加入它:

DECLARE @x xml

SELECT @x = CAST('<v>'+REPLACE(@issueid,',','</v><v>')+'</v>' as xml)

SELECT  im.*,
        oe.*
FROM ISSUE_MASTER im (NOLOCK), 
INNER JOIN ORDER_ENTRY_PPDI oe (NOLOCK) 
    ON im.ISM_ID= oe.OE_ISSUE_ID  
INNER JOIN (
        SELECT t.v.value('.','int') as ism_id
        FROM @x.nodes('/v') as t(v)
    ) t
    ON oe.oe_issue_id = t.ism_id
WHERE ISM_STATUS = 0  
    AND ism_group_name='TEST_COPY'
GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID

动态SQL:

DECLARE @sql nvarchar(max)

@sql = N'
SELECT * 
FROM ISSUE_MASTER im (NOLOCK), 
INNER JOIN ORDER_ENTRY_PPDI oe (NOLOCK) 
    ONim.ISM_ID= oe.OE_ISSUE_ID  
WHERE convert(varchar,oe_issue_id) in ('+@issueid+') 
    AND ISM_STATUS = 0  
GROUP BY ISM_ISSUER_NAME,ISM_ISSUE_NAME,OE_ISSUE_ID'

EXEC sp_executesql @sql

注意:使用别名,使用新样式连接。