如何逐行处理发送到 SQL Server 2008 R2 中的过程的整数列表?

How to process an integer list row by row sent to a procedure in SQL Server 2008 R2?

我有一个 ArrayList(在 C# 中),其中包含一些 int 数字(这些是 table 中的 ID),我想 select 每个数字的一​​些数据(s ) 在这个 ArrayList 和 return 一个 table variable or a #temporary table :)

我找到了将此 ArrayList 作为用户定义的 table 类型传递给我的存储过程的解决方案:

CREATE TYPE [dbo].[integer_list_tbltype] AS TABLE(
    [n] [int] NOT NULL,
    PRIMARY KEY CLUSTERED ([n] ASC)
        WITH (IGNORE_DUP_KEY = OFF)
)
GO

CREATE PROCEDURE [dbo].[Sp_apr_get_apraisors]
    (@listNumbers INTEGER_LIST_TBLTYPE readonly)
AS
   ....

但我没有找到像在 C# 中那样轻松读取此数组的有效方法:(

有没有办法为这些数字中的每一个编写一个循环并将数据保存在临时 table 中,最后 return 将其保存到 C#?

SQL 是基于集合的,因此您最好的选择是编写一个 select 语句,将您的输入 table 加入到包含数据的 table 中你想抬头看看。 select 语句将是要发送回您的应用程序的结果集。然后如果你想直接使用 ADO.Net,你可以使用 SqlDataReader class 读回 C#,或者你可以使用像 Linq2Sql 这样的 ORM,Entity Framework,或 NHibernate。顺便说一句,如果你必须在 Sql 中做一个循环,请避免游标。它们的管理和开发速度缓慢且不必要地复杂。请改用 while 循环。

我建议您将过程参数更改为 varchar(n),然后将这些值作为逗号分隔的字符串发送。

DECLARE @IDs VARCHAR(MAX)
SELECT @IDs = '1,2,3'

DECLARE @ID INT

WHILE LEN(@IDs) > 0
BEGIN

    SELECT @ID = CONVERT(INT, LEFT(@IDs, CHARINDEX(',', @IDs + ',') -1)
    -- Do something with the ID here...

    SELECT @IDs = STUFF(@IDs, 1, CHARINDEX(',', @IDs + ','), '')
END

mmmmm :),在 www 上搜索 24 小时(!)后,我发现了我的问题答案,@Toni 的回答在这方面帮助了我 :) Tanx @Toni :*

1)先定义存储过程

CREATE PROCEDURE [spName]( @list_entry  VARCHAR(max)=NULL)
AS
  BEGIN
      SELECT [Column1,column2,...]
      FROM   [TABLE(s)]
      WHERE ( @list_entry IS NULL
                    OR Column1 IN (SELECT value FROM   Fn_split(@list_person, ',')) )     
  END 

2) 编写一个拆分项目的函数(逗号分隔)

CREATE  FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20) = ' ')
RETURNS @Strings TABLE
(   
  position int IDENTITY PRIMARY KEY,
  value varchar(8000)  
)
AS
BEGIN

DECLARE @index int
SET @index = -1

WHILE (LEN(@text) > 0)
  BEGIN 
    SET @index = CHARINDEX(@delimiter , @text) 
    IF (@index = 0) AND (LEN(@text) > 0) 
      BEGIN  
        INSERT INTO @Strings VALUES (@text)
          BREAK 
      END 
    IF (@index > 1) 
      BEGIN  
        INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))  
        SET @text = RIGHT(@text, (LEN(@text) - @index)) 
      END 
    ELSE
      SET @text = RIGHT(@text, (LEN(@text) - @index))
    END
  RETURN
END
GO

3) 从 .NET 将我的数组作为逗号分隔的字符串传递

//defin sample array list or your data
ArrayList array = new  ArrayList();

//fill array with some data
for (int i = 1000; i<1010;i++)
    array.Add(i);

//define connection and command
using(SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["connString"].ConnectionString))
{
    connection.Open();
    SqlCommand cmd = new SqlCommand("",connection);
    cmd.Parameters.AddWithValue("@list_entry", SqlDbType.varchar,8000,Get_comma_delimited_string(array));
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "yourSpName";
    cmd.ExecuteNonQuery();
}

/// <summary>
/// Resturns a comma delimited string (sepearte each item in list with ',' )
/// </summary>            
public string Get_comma_delimited_string(ArrayList arrayList)
{
    string result = string.Empty;
    foreach (object item in arrayList)
        result += item.ToString() + ",";

    return result.Remove(result.Length - 1);
}