0

我很想从 C# 中传入一个值列表并在我的存储过程中查询它。

这就是我所拥有的:

select   distinct FileStream_ID
FROM         dbo.vEmailSent
WHERE     
RequestType_ID in ( + '"' + @RequestTypeID +'"' + )

但我在带括号和不带括号的语法上遇到错误。请帮忙。

4

3 回答 3

4

您可能有一些语法错误。

首先,您的子句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 结果。

于 2013-01-14T16:41:29.087 回答
1

你有一个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 中使用表值参数的数组和列表

于 2013-01-14T16:41:08.180 回答
0

这不起作用,您需要使用表值参数(如果您使用的是 SQL Server 2008+)、动态 SQL、XML,使用函数或类似方法将字符串拆分为表。

MVP Erland Sommarskog 对每种方法的优缺点进行了出色的细分,性能数据如下:

http://www.sommarskog.se/arrays-in-sql.html

于 2013-01-14T16:44:53.190 回答