c# - 使用 ado.net 执行时,逗号分隔的字符串值不适用于 sql 查询的 In 子句

标签 c# .net ado.net

我正在尝试获取逗号分隔的技能 Ids 但在使用 ado.net 执行查询时得到 null

当我在 SQL Server Management Studio 中运行它时查询工作正常,但是当我尝试使用 ado.net 执行它时,我没有得到任何输出。

我有 2 个表 EmployeeSkills,其中包含以下列:

  • 员工:ID、姓名、位置
  • Skills: Id, Skills

员工数据:

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;
    }
}

这是我得到的数据:

enter image description here

但是当我运行下面的查询时,我成功地获得了如下输出: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 函数来拆分以逗号分隔的字符串,如 this answer 中所述.

然后您可以在查询中使用它,例如像这样的东西:

...
" And S.Skills In (SELECT Value FROM F_Split(@skills, ','))" +
...

您的@Skills 参数应包含以逗号分隔的 ID 列表,不带单引号:

cmd.Parameters.AddWithValue("@skills", csvSkillsIds);

关于c# - 使用 ado.net 执行时,逗号分隔的字符串值不适用于 sql 查询的 In 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38047569/

相关文章:

c# - 阻止 webclient 转义字符串

c# - pipeline.Fit() 函数在 .Net Web 应用程序中不起作用

c# - .NET 中的数据结构,将项目存储为已排序且唯一且可按范围查询(并且不是 SortedSet)

.net - 我可以通过 CRM 2011 中的插件创建非事件记录吗?

c# - 计时器控制间隔

c# - 创建唯一标识符,它是父标识符的可识别子标识符

c# - 使用 smo 重命名数据文件

asp.net-mvc-3 - 如何在按钮单击时更新数据库表?

c# - 尝试填充列表对象时出现 fatal error

c# - EF需要时间来执行SP