当前位置: 首页 > 面试题库 >

用逗号分隔的类似数组的字符串执行存储过程

秦哲瀚
2023-03-14
问题内容

我想编写一个对表执行选择操作的存储过程,并且需要一个类型为type的输入变量varchar(max)

我想发送一堆,以输入参数分隔的值,例如

'Jack','Jane','Joe'

然后获取包含这些名称之一的行。

在SQL中,代码将是

Select * from Personnel where Name in ('Jack','Joe','Jane');

现在我想在我的C#应用​​程序中有一个变量,说出strNames并像这样填充它

string strNames = "'Jack','Joe','Jane'";

并将此变量发送到SP并执行它。就像是

Select * from Personnel where Name in (''Jack','Joe','Jane'') -- this is wrong

但是 如何告诉SQL Server运行这样的命令?

我需要做到这一点,我知道这是可能的,请给我提示。


问题答案:

首先,当您将单个名称传递给存储过程时,不需要使用单引号。

using (SqlCommand cmd = new SqlCommand("MyStoredProc", conn))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@longFilter", "Jack,Jill,Joe");

    using (SqlDataReader reader = cmd.ExecuteReader())
    {
        ...
    }
}

然后,在存储过程中,可以使用简单的文本函数和如下所示的临时表在逗号处分割字符串,并为字符串的每个部分输入临时表的条目:

DECLARE @temp AS TABLE (Name NVARCHAR(255))

IF ISNULL(@longFilter, '') <> ''
BEGIN
    DECLARE @s NVARCHAR(max)
    WHILE LEN(@longFilter) > 0
    BEGIN
        IF CHARINDEX(',', @longFilter) > 0
        BEGIN
            SET @s = LTRIM(RTRIM(SUBSTRING(@longFilter, 1, CHARINDEX(',', @longFilter) - 1)))
            SET @longFilter = SUBSTRING(@longFilter, CHARINDEX(',', @longFilter) + 1, LEN(@longFilter))
        END ELSE
        BEGIN
            SET @s = LTRIM(RTRIM(@longFilter))
            SET @longFilter= ''
        END

        -- This was missing until 20140522
        INSERT INTO @temp (Name) VALUES (@s)
    END
END

稍后使用以下SELECT命令获取所有其姓名在其中的人员的列表,@temp或者如果@temp不包含任何行(未经过滤的结果),则列出所有这些人员:

SELECT * FROM Personnel WHERE Name IN (SELECT Name FROM @temp) OR (SELECT COUNT(*) FROM @temp) = 0


 类似资料:
  • 问题内容: 如何将逗号分隔的字符串拆分为存储过程中的字符串,并将其插入表字段中? 使用Firebird 2.5 问题答案: 这里有一个示例如何分割字符串并将子字符串写入表中:

  • 问题内容: 我有一个。所选(选中)的项目存储在中。 例如,选择的值超过7天 我正在转换为以逗号分隔的,即 现在,我将此值作为字符串传递给存储过程。我想触发查询,如: 我的问题是:如何在存储过程中分离字符串? 问题答案: 如果传递逗号分隔(任何分隔符)的字符串来存储过程并在查询中使用,那么必须吐出该字符串,然后才能使用它。 下面有例子:

  • 问题内容: 我希望有人能够提供帮助。我创建了我的第一个存储过程(没什么花哨的),但是我遇到了问题。 我想给它一个字符串输入,例如1,2,3,4,5,然后它做一个简单的 SELECT * FROM [TABLE] WHERE EAN IN (VAR); 因此,存储的过程如下所示: – Routine DDL – Note: comments before and after the routine

  • 问题内容: 我有从.net应用程序A,B,C,D,E,F获取的字符串, 我想写一个SQL选择语句像 这在t-SQL中将不起作用,因为它使用不将值分开的一个字符串。有什么办法可以做到这一点? 问题答案: 它认为最简单的方法是动态SQL生成:

  • 问题内容: 欲分割为4的阵列,以利用 这是我的代码: 但是,结果标记是一个空数组:[],而不是 我想要的4数组。 我已经测试过更改一点: 这次的结果标记为。这与我想要的接近,但是我真的不想在拆分之前添加此“ 1”。 问题基本上是,如果它仅包含空元素,它将返回一个空数组。 您能帮助解决问题吗? 问题答案: 您需要使用带有limit参数的重载方法。 从文档(重点是我的): limit参数控制应用图案的

  • 问题内容: 我知道如果要将s 数组转换为a ,我可以这样做: 但我不知道如何将s 数组转换为逗号分隔 问题答案: 好吧,你可以这样做: