stored proc - executing a query with NOT IN where clause(存储过程 - 使用 NOT IN where 子句执行查询)
问题描述
我有一个存储过程
Create PROCEDURE abc
@sRemovePreviouslySelectedWhereClause nvarchar(max)
AS
BEGIN
SELECT *
FROM table
WHERE nId NOT IN (@sRemovePreviouslySelectedWhereClause)
END;
参数 @sRemovePreviouslySelectedWhereClause
可以有像 0,1 这样的值.但这失败并显示错误消息:
The parameter @sRemovePreviouslySelectedWhereClause
can have values like 0,1 . But this fails with error message:
将 nvarchar 值0,1"转换为数据类型 int 时转换失败.
Conversion failed when converting the nvarchar value ' 0,1 ' to data type int.
除了动态查询,还有其他方法可以实现吗?
Is there any other way to achieve this other than dynamic queries?
推荐答案
首先,创建一个拆分函数,将分隔的字符串拆分成一个表格:
First, create a split function which splits your delimited string into a table:
CREATE FUNCTION [dbo].[Split]
(
@String varchar(max)
,@Delimiter char
)
RETURNS @Results table
(
Ordinal int
,StringValue varchar(max)
)
as
begin
set @String = isnull(@String,'')
set @Delimiter = isnull(@Delimiter,'')
declare
@TempString varchar(max) = @String
,@Ordinal int = 0
,@CharIndex int = 0
set @CharIndex = charindex(@Delimiter, @TempString)
while @CharIndex != 0 begin
set @Ordinal += 1
insert @Results values
(
@Ordinal
,substring(@TempString, 0, @CharIndex)
)
set @TempString = substring(@TempString, @CharIndex + 1, len(@TempString) - @CharIndex)
set @CharIndex = charindex(@Delimiter, @TempString)
end
if @TempString != '' begin
set @Ordinal += 1
insert @Results values
(
@Ordinal
,@TempString
)
end
return
end
然后按如下方式更改您的 where 子句:
Then change your where clause as follows:
select
t.*
from [yourTable] t
where t.[ID] not in (select cast([StringValue] as int) from dbo.Split(@sRemovePreviouslySelectedWhereClause,','))
这篇关于存储过程 - 使用 NOT IN where 子句执行查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:存储过程 - 使用 NOT IN where 子句执行查询


- SQL 临时表问题 2022-01-01
- 如何使用 pip 安装 Python MySQLdb 模块? 2021-01-01
- 如何将 SonarQube 6.7 从 MySQL 迁移到 postgresql 2022-01-01
- 远程 mySQL 连接抛出“无法使用旧的不安全身份验证连接到 MySQL 4.1+"来自 XAMPP 的错误 2022-01-01
- 导入具有可变标题的 Excel 文件 2021-01-01
- 如何将 Byte[] 插入 SQL Server VARBINARY 列 2021-01-01
- 以一个值为轴心,但将一行上的数据按另一行分组? 2022-01-01
- 更改自动增量起始编号? 2021-01-01
- 使用 Oracle PL/SQL developer 生成测试数据 2021-01-01
- 在SQL中,如何为每个组选择前2行 2021-01-01