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)