C# 我不知道会有多少身份证。只有在运行时我才会知道。你不知道ID的数量没关系,动态创建SQL.thnx,但我不知道会有多少ID。只有在运行时我才会知道。你不知道ID的数量没关系,动态创建SQL。+1,但是为什么你说这不是很好的实践呢?如果您的数据库支持UDF,

C# 我不知道会有多少身份证。只有在运行时我才会知道。你不知道ID的数量没关系,动态创建SQL.thnx,但我不知道会有多少ID。只有在运行时我才会知道。你不知道ID的数量没关系,动态创建SQL。+1,但是为什么你说这不是很好的实践呢?如果您的数据库支持UDF,,c#,parameters,sqlcommand,sql,C#,Parameters,Sqlcommand,Sql,我不知道会有多少身份证。只有在运行时我才会知道。你不知道ID的数量没关系,动态创建SQL.thnx,但我不知道会有多少ID。只有在运行时我才会知道。你不知道ID的数量没关系,动态创建SQL。+1,但是为什么你说这不是很好的实践呢?如果您的数据库支持UDF,那么这是一个很好的解决方案。对于更复杂的查询,此解决方案为您提供了准备执行的好处:这是一种不好的做法,因为它不能(也不能)很好地扩展。如果采用这种方法,则会受到数据类型最大容量的限制。如果您选择动态SQL路线,您将失去可重用执行计划的优势,并假


我不知道会有多少身份证。只有在运行时我才会知道。你不知道ID的数量没关系,动态创建SQL.thnx,但我不知道会有多少ID。只有在运行时我才会知道。你不知道ID的数量没关系,动态创建SQL。+1,但是为什么你说这不是很好的实践呢?如果您的数据库支持UDF,那么这是一个很好的解决方案。对于更复杂的查询,此解决方案为您提供了准备执行的好处:这是一种不好的做法,因为它不能(也不能)很好地扩展。如果采用这种方法,则会受到数据类型最大容量的限制。如果您选择动态SQL路线,您将失去可重用执行计划的优势,并假定允许使用动态SQL。+1,但您为什么说这不是一个很好的实践呢?如果您的数据库支持UDF,那么这是一个很好的解决方案。对于更复杂的查询,此解决方案为您提供了准备执行的好处:这是一种不好的做法,因为它不能(也不能)很好地扩展。如果采用这种方法,则会受到数据类型最大容量的限制。如果您选择动态SQL路线,您将失去可重用执行计划的优势,并假定允许使用动态SQL。
public int GetNumberOfArticles(string employeeIds)
{
    System.Data.DataTable dataTable;
    System.Data.SqlClient.SqlDataAdapter dataAdapter;
    System.Data.SqlClient.SqlCommand command;

    int numberOfArticles = 0;

    command = new System.Data.SqlClient.SqlCommand();
    command.Connection = Classes.Database.SQLServer.SqlConnection;

    command.CommandText = @"SELECT COUNT(*)
                            FROM 
                                  [Articles]
                            WHERE 
                                  [Articles].[EmployeeID] IN (@EmployeeIds)";

    command.Parameters.AddWithValue("@EmployeeIds", employeeIds);
    numberOfArticles = (int)command.ExecuteScalar();
    return numberOfArticles;
}
1, 2, 3
command.Parameters.AddWithValue("@EmployeeIds", employeeIds);
command.Parameters.AddWithValue("@EmployeeIds", "1, 2, 3");
IF EXISTS(SELECT * FROM sysobjects WHERE ID = OBJECT_ID(’UF_CSVToTable’))
 DROP FUNCTION UF_CSVToTable
GO

CREATE FUNCTION UF_CSVToTable
(
 @psCSString VARCHAR(8000)
)
RETURNS @otTemp TABLE(sID VARCHAR(20))
AS
BEGIN
 DECLARE @sTemp VARCHAR(10)

 WHILE LEN(@psCSString) > 0
 BEGIN
  SET @sTemp = LEFT(@psCSString, ISNULL(NULLIF(CHARINDEX(',', @psCSString) - 1, -1),
                    LEN(@psCSString)))
  SET @psCSString = SUBSTRING(@psCSString,ISNULL(NULLIF(CHARINDEX(',', @psCSString), 0),
                               LEN(@psCSString)) + 1, LEN(@psCSString))
  INSERT INTO @otTemp VALUES (@sTemp)
 END

RETURN
END
Go
SELECT                          
    COUNT(*)
FROM 
    [Articles]

JOIN dbo.UF_CSVToTable(@EmployeeIds) ids on ids.sID = [Articles].[EmployeeID]
command.CommandText = @"SELECT COUNT(*) FROM [Articles] " +
    "WHERE [Articles].[EmployeeID] IN (" + employeeIds + ")";
public int GetNumberOfArticles(string employeeIds)
{
    System.Data.DataTable dataTable;
    System.Data.SqlClient.SqlDataAdapter dataAdapter;
    System.Data.SqlClient.SqlCommand command;

    int numberOfArticles = 0;

    command = new System.Data.SqlClient.SqlCommand();
    command.Connection = Classes.Database.SQLServer.SqlConnection;

    string params = string.Join(",", employeeIds.Select((e, i)=> "@employeeId" + i.ToString()).ToArray());
    command.CommandText = @"SELECT                          
                               COUNT(*)
                            FROM 
                               [Articles]
                            WHERE 
                               [Articles].[EmployeeID] IN (" + params + ")";

    for (int i = 0; i < employeeIds.Length; i++) {
       command.Parameters.AddWithValue("@employeeId" + i.ToString(), employeeIds[i]);
    }

    numberOfArticles = (int)command.ExecuteScalar();

    return numberOfArticles;
}