我想编写一个对表执行选择操作的存储过程,并且需要一个类型为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 数组转换为逗号分隔 问题答案: 好吧,你可以这样做: