将一组唯一标识符传递给存储过程

时间:2013-01-14 18:41:19

标签: sql sql-server tsql stored-procedures

  

可能重复:
  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'附近的语法不正确。

任何人都知道我做错了什么?

2 个答案:

答案 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+',%'