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,因此最好改为发送一个表值参数。如果您不想将查询转换为存储过程,那么