【问题标题】:Passing an array of unique identifiers to a stored procedure [duplicate]将一组唯一标识符传递给存储过程[重复]
【发布时间】:2013-01-14 18:41:18
【问题描述】:

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

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

【问题讨论】:

    标签: sql sql-server tsql stored-procedures


    【解决方案1】:
    <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
    

    【讨论】:

      【解决方案2】:

      我很困惑。你的第一个查询运行正确是什么意思?对于人类(至少是这个),您似乎正在寻找两个值:'852D7F39-302A-4E35-94D4-9A0335F8E9DC''1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82'。但是,SQL 将您的表达式解释为 one'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+',%'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-27
        • 1970-01-01
        相关资源
        最近更新 更多