如何逐行处理发送到 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);
}
我有一个 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);
}