Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 存储过程-发送in参数列表以与in子句一起使用_Sql Server_Stored Procedures - Fatal编程技术网

Sql server 存储过程-发送in参数列表以与in子句一起使用

Sql server 存储过程-发送in参数列表以与in子句一起使用,sql-server,stored-procedures,Sql Server,Stored Procedures,[副本] 问题:我需要将值列表发送到存储过程中,以便与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个结果,但我希望得到类型为i或M的结果。我不相

[副本]


问题:我需要将值列表发送到存储过程中,以便与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个结果,但我希望得到类型为i或M的结果。

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

尝试:


我在过去也遇到过这个问题,并在web上找到了一些解决方案。我找到的解决方案是解析输入字符串中的各个值,将它们作为行放到临时表中,然后使用带有in子句的subselect来获取值。下面是我正在使用的代码的简化。它假定这些值从IN子句中可以看出,使用varchar相对容易

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


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)


我想这样做,但不是使用EXEC,而是使用EXECUTE@ErrorCode=sp_ExecuteSQL@sql,这样我可以得到一个错误响应,知道我是否需要回滚我正在执行的代码。Loxp,这是一个很好的想法,尽管简单的选择没有什么可回滚的…很好的一点。有更新、插入和选择基于同一参数列表的。

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)