C# 使用ado.net执行sql查询时,逗号分隔的字符串值不适用于In子句
我试图获取逗号分隔的技能C# 使用ado.net执行sql查询时,逗号分隔的字符串值不适用于In子句,c#,.net,ado.net,C#,.net,Ado.net,我试图获取逗号分隔的技能Ids,但在使用ado.net执行查询时获取null 当我在SQLServerManagementStudio中运行该查询时,它工作正常,但当我尝试使用ado.net执行它时,却没有得到任何输出 我有两个表Employee和Skills,包括以下列: 员工:Id、姓名、位置 技能:Id,技能 员工数据: Id Name Location 7 Abc London 8 Xyz London 9 Xyz USA 1
Ids
,但在使用ado.net执行查询时获取null
当我在SQLServerManagementStudio中运行该查询时,它工作正常,但当我尝试使用ado.net执行它时,却没有得到任何输出
我有两个表Employee
和Skills
,包括以下列:
:Id、姓名、位置员工
:Id,技能技能
Id Name Location
7 Abc London
8 Xyz London
9 Xyz USA
10 Abc USA
技能:
Id skills EmployeeId
12 AAA Xyz 7
13 BBB 7
14 CCC 7
15 AAA 8
16 BBB 8
17 CCC 8
18 AAA 9
19 BBB 9
20 CCC 9
21 AAA 10
22 BBB 10
20 CCC 10
到目前为止,我的代码是:
string Name = "Abc";
string Location = "London";
string csvSkillsIds = string.Join(",", Skill1, Skill2); //AAA Xyz,BBB
'AAA Xyz','BBB' //Added single quotes to comma separated values
string skillList = string.Join(",", csvSkillsIds.Split(',').Select(x => string.Format("'{0}'", x)).ToList());
using (SqlConnection connection = new SqlConnection(""))
{
string query = "Select Stuff(" +
" (" +
" Select ',' + Convert(Varchar, CD.Id)" +
" From Employee as E" +
" Skills S On S.EmployeeId = E.Id " +
" Where E.Name = @name " +
" And E.Location = @location " +
" And S.Skills In (@skills)" +
" For Xml Path ('')" +
" ), 1, 1, ''" +
" ) As SkillId";
using (SqlCommand cmd = new SqlCommand(query, connection))
{
connection.Open();
cmd.Parameters.AddWithValue("@name", Name);
cmd.Parameters.AddWithValue("@location", Location);
cmd.Parameters.AddWithValue("@skills", skillList);
var data = cmd.ExecuteScalar(); //getting no output not even null
connection.Close();
if (data != null)
return data.ToString();
else
return null;
}
}
这是我从数据中得到的:
但当我运行下面的查询时,我成功地获得了如下输出:12、13
Select Stuff
(
(
Select ',' + Convert(Varchar, S.Id)
From Employee E
Join Skills S On S.EmployeeId = E.Id
Where E.Name = @name
And E.Location = @location
And S.Skills In ('AAA Xyz', 'BBB')
For Xml Path ('')
), 1, 1, ''
) As Skills
所以我猜问题在下面一行:
And S.Skills In (@skills)
预期输出:
12,13
您可以创建一个SQL Server函数,该函数将拆分逗号分隔的字符串,如中所述
然后您可以在查询中使用它,例如:
...
" And S.Skills In (SELECT Value FROM F_Split(@skills, ','))" +
...
@Skills参数应包含逗号分隔的ID列表,不带单引号:
cmd.Parameters.AddWithValue("@skills", csvSkillsIds);
在调试模式下,
skillList
的值是多少?@Balaji:我已经在上面的skillList变量上写过了。@skills
不是逗号分隔的值列表。它是一个包含逗号分隔字符串的单个值。这是一个非常常见的错误。由于您使用的是c#和sql server,因此最好改为发送一个表值参数。如果您不想将查询转换为存储过程,那么