-1

可能重复:
参数化 SQL IN 子句?
将参数数组传递给存储过程

我需要将一组唯一标识符传递给我的存储过程。我写了这个查询来测试我想要做什么:

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' 附近的语法不正确。

有人知道我在做什么错吗?

4

2 回答 2

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
于 2013-01-14T20:00:18.633 回答
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 会让人感到困惑。charindex()仅使用或like在常规 SQL 中可能更容易:

where charindex(','+MyTable.TypeId+',' , ','+@TypeIdsList+',') > 0

或者

where ','+@TypeIdsList+',' like '%,'+MyTable.TypeId+',%'
于 2013-01-14T18:52:54.130 回答