我很想从 C# 中传入一个值列表并在我的存储过程中查询它。
这就是我所拥有的:
select distinct FileStream_ID
FROM dbo.vEmailSent
WHERE
RequestType_ID in ( + '"' + @RequestTypeID +'"' + )
但我在带括号和不带括号的语法上遇到错误。请帮忙。
我很想从 C# 中传入一个值列表并在我的存储过程中查询它。
这就是我所拥有的:
select distinct FileStream_ID
FROM dbo.vEmailSent
WHERE
RequestType_ID in ( + '"' + @RequestTypeID +'"' + )
但我在带括号和不带括号的语法上遇到错误。请帮忙。
您可能有一些语法错误。
首先,您的子句and
开头有一个。WHERE
改成:
WHERE
RequestType_ID in ( + '"' + @RequestTypeID +'"' + )
其次,你有括号+
的开头和结尾。IN
这是无效的,应改为:
WHERE
RequestType_ID in ('"' + @RequestTypeID + '"')
最后,你不应该有'"'
. 如果你的参数@RequestTypeID
是一个int
类型,你应该CAST()
是一个varchar
类型,而不是用引号引起来:
WHERE
RequestType_ID in (CAST(@RequestTypeID as varchar(100))
我怀疑这不是你想要做的,这@RequestTypeID
实际上是逗号分隔的整数。
在这种情况下,您不能像尝试那样使用它。如果@RequestTypeID = '1,2,3'
,则 SQL 将返回记录 where RequestType_ID = '1,2,3'
。因此 0 结果。
你有一个AND
直接在WHERE
. 但即使你解决了这个问题,你也需要一个Split
函数,然后这个工作:
WHERE
([RequestType_ID] IN
(SELECT Item
FROM dbo.Split(@RequestTypeID, ',') AS Split))
这是表值函数的可能实现:
CREATE FUNCTION [dbo].[Split]
(
@ItemList NVARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @IDTable TABLE (Item VARCHAR(50))
AS
BEGIN
DECLARE @tempItemList NVARCHAR(MAX)
SET @tempItemList = @ItemList
DECLARE @i INT
DECLARE @Item NVARCHAR(4000)
SET @tempItemList = REPLACE (@tempItemList, ' ', '')
SET @i = CHARINDEX(@delimiter, @tempItemList)
WHILE (LEN(@tempItemList) > 0)
BEGIN
IF @i = 0
SET @Item = @tempItemList
ELSE
SET @Item = LEFT(@tempItemList, @i - 1)
INSERT INTO @IDTable(Item) VALUES(@Item)
IF @i = 0
SET @tempItemList = ''
ELSE
SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i)
SET @i = CHARINDEX(@delimiter, @tempItemList)
END
RETURN
END
这不起作用,您需要使用表值参数(如果您使用的是 SQL Server 2008+)、动态 SQL、XML,使用函数或类似方法将字符串拆分为表。
MVP Erland Sommarskog 对每种方法的优缺点进行了出色的细分,性能数据如下: