我有一个存储过程
Create PROCEDURE abc
@sRemovePreviouslySelectedWhereClause nvarchar(max)
AS
BEGIN
SELECT *
FROM table
WHERE nId NOT IN (@sRemovePreviouslySelectedWhereClause)
END;
参数@sRemovePreviouslySelectedWhereClause
的值可以为0,1。但是这失败并显示错误消息:
将nvarchar值'0,1'转换为数据类型int时,转换失败。
除了动态查询之外,还有其他方法可以实现这一目标吗?
答案 0 :(得分:2)
首先,创建一个split函数,将分隔的字符串拆分为一个表:
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子句:
select
t.*
from [yourTable] t
where t.[ID] not in (select cast([StringValue] as int) from dbo.Split(@sRemovePreviouslySelectedWhereClause,','))
答案 1 :(得分:1)
Create FUNCTION [dbo].[fn_Split] (
@List nvarchar(2000), @SplitOn nvarchar(5)
)
RETURNS @RtnValue table (
Value nvarchar(100) )
AS
BEGIN
While (Charindex(@SplitOn,@List)>0)
Begin
Insert Into @RtnValue (value)
Select Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))
Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
End
Insert Into @RtnValue (Value)
Select Value = ltrim(rtrim(@List))
Return
END
**********
Create PROCEDURE abc
@sRemovePreviouslySelectedWhereClause nvarchar(max)
AS
BEGIN
SELECT *
FROM Table
WHERE nId NOT IN (select * from dbo.fn_Split(@sRemovePreviouslySelectedWhereClause,','))
END;
答案 2 :(得分:0)
您必须将'sRemovePreviouslySelectedWhereClause参数除以',',并将结果值放在临时表中。然后你的选择看起来像
select * from table where nId not in (select nId from #tempIds)
答案 3 :(得分:0)
你尝试的这种方法不起作用。但是,如果您使用的是SQL Server 2008,则可以使用名为Table Valued Parameters的新功能。
基本上,您可以创建用户定义的表类型
CREATE TYPE dbo.nIdTable AS TABLE(nID INT)
然后您可以从外部传递该TVP中的多个值(例如来自ADO.NET等):
CREATE PROCEDURE abc(@idValues dbo.nIdTable READONLY)
并在存储过程中使用该表变量:
SELECT *
FROM table
WHERE nId NOT IN (SELECT nID FROM @idValues)
答案 4 :(得分:-1)
您需要使用Dynamic sql进行此类查询。
首先构建查询和
SET @sql = 'select * from table
where nId not in (' + @sRemovePreviouslySelectedWhereClause+ ')'
然后使用EXEC(@sql)
来运行查询。