我是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
请帮忙!我做错了什么?
答案 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
注意:使用别名,使用新样式连接。