【问题标题】:Stored procedure - Send a list of parameters in for use with the IN clause [duplicate]存储过程 - 发送参数列表以与 IN 子句一起使用 [重复]
【发布时间】:2009-02-10 18:20:49
【问题描述】:

[Parameterize an SQL IN clause 重复


问题:我需要将值列表发送到存储过程中,以便与 WHERE 子句中的 IN 语句一起使用。

示例:

declare @SPType NVARCHAR ( 30 )
declare @SPCodeA int

set @SPCodeA  = 75
set @SPType  = '''I'',''M'''

select * from table 
where CodeA=@SPCodeA 
and Type in (@SPType)

从上面我得到 0 个结果,但我想得到 Type 是 I 或 M 的结果。

【问题讨论】:

    标签: sql-server stored-procedures


    【解决方案1】:

    我不相信'IN'子句可以处理表达式,我相信你需要一个文字。

    试试:

    declare @sql NVARCHAR(MAX)
    
    declare @SPType NVARCHAR ( 30 )
    declare @SPCodeA int
    
    set @SPCodeA  = 75
    set @SPType  = '''I'',''M'''
    SET @sql = 'select * from table where CodeA=' + CONVERT(NVARCHAR(MAX), @spcodea) +' and Type in (' + @sptype + ')'
    
    EXEC (@sql)
    

    【讨论】:

    • 我正在考虑这样做,但我不使用 EXEC,而是使用 EXECUTE @ErrorCode = sp_ExecuteSQL @sql 以便我可以获得错误响应以了解是否需要回滚代码我正在执行。
    • Loxp,好主意,虽然没有什么可以用简单的 SELECT 回滚...
    • 好点。有基于相同参数列表的更新和插入以及选择。
    【解决方案2】:

    我过去也遇到过这个问题,并在网上找到了一些解决方法。我找到的解决方案是解析输入字符串中的各个值,将它们作为行放入临时表中,然后使用带有 IN 子句的子选择来获取值。下面是我正在使用的代码的简化。它假定 IN 子句中的值是 smallints,使用 varchar 会很容易更改。

    如需进一步参考,请参阅this 文章,了解解决此问题的不同方法。

    DECLARE @TempList table ( Enum smallint ) DECLARE @Enum varchar(10), @Pos int SET @ValueList = LTRIM(RTRIM(@ValueList))+ ',' SET @Pos = CHARINDEX(',', @ValueList, 1) IF REPLACE(@ValueList, ',', '') '' BEGIN WHILE @Pos > 0 BEGIN SET @Enum = LTRIM(RTRIM(LEFT(@ValueList, @Pos - 1))) IF @Enum '' BEGIN INSERT INTO @TempList (Enum) VALUES (CAST(@Enum AS smallint)) --Use Appropriate conversion END SET @ValueList = RIGHT(@ValueList, LEN(@ValueList) - @Pos) SET @Pos = CHARINDEX(',', @ValueList, 1) END END SELECT * FROM ExampleTable WHERE ExampleTable.Enum in (select Enum from @TempList)

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 2010-11-01
      • 2010-09-19
      • 2018-08-10
      • 2010-10-11
      相关资源
      最近更新 更多