可能重复:
Parameterizing an SQL IN clause?
Passing an array of parameters to a stored procedure
我需要将一组唯一标识符传递给我的存储过程。我写了这个查询来测试我想做的事情:
SELECT *
FROM MyTable
WHERE MyTable.TypeId IN ('852D7F39-302A-4E35-94D4-9A0335F8E9DC,1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82')
此查询正确运行。所以我创建了这个存储过程:
CREATE PROCEDURE [dbo].[MySproc] (
@TypeIdsList varchar(8000)
) AS
BEGIN
EXEC(
'SELECT *
FROM MyTable
WHERE MyTable.TypeId IN (' + @TypeIdsList + ')'
)
END
但是当我用一些样本数据执行它时:
DECLARE @return_value int
EXEC @return_value = [dbo].[MySproc]
@TypeIdsList = N'852D7F39-302A-4E35-94D4-9A0335F8E9DC,1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82'
SELECT 'Return Value' = @return_value
GO
我收到此错误:
'D7F39'附近的语法不正确。
任何人都知道我做错了什么?
答案 0 :(得分:2)
<ids>
<id value='852D7F39-302A-4E35-94D4-9A0335F8E9DC'/>
<id value='1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82'/>
</ids>
create procedure [dbo].[MySproc] (@TypeIdsList xml)
as
begin
declare @idoc int
exec sp_xml_preparedocument @idoc output, @TypeIdsList
create table #ids (id uniqueidentifier)
insert into #ids
select a.value
from openxml (@idoc, '/ids/id',1)
with (value uniqueidentifier) a
select t.*
from MyTable t
inner join #ids i with (nolock) on t.TypeId = i.id
-- or
-- SELECT t.*
-- FROM MyTable t
-- WHERE t.TypeId IN (SELECT i.id FROM #ids WITH(NOLOCK))
end
答案 1 :(得分:0)
我很困惑。你的第一个查询是否正确运行是什么意思?对于人类(至少是这一个),您似乎正在寻找两个值:'852D7F39-302A-4E35-94D4-9A0335F8E9DC'
或'1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82'
。但是,SQL会将您的表达式解释为一个值'852D7F39-302A-4E35-94D4-9A0335F8E9DC,1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82'
,并在其中加上逗号。
您的存储过程似乎想将其转换为两个值。但是,您的逗号有问题。你需要这样的东西:
WHERE MyTable.TypeId IN (''' + replace(@TypeIdsList, ',', '''') + ''')'
哦,动态SQL会让人感到困惑。在常规SQL中使用charindex()
或like
可能更容易:
where charindex(','+MyTable.TypeId+',' , ','+@TypeIdsList+',') > 0
或
where ','+@TypeIdsList+',' like '%,'+MyTable.TypeId+',%'