将List <string>传递给存储过程</string>

时间:2012-04-09 14:37:16

标签: asp.net sql-server stored-procedures

我有一个字符串列表,我需要检查列表中的任何值是否包含在数据库table.if exists中,返回现有值的数据集。

public DataSet CheckDocumentNumber(List<string> DocNumber)
{
   DataSet DocNum = new DataSet();
   SqlTransaction transaction = DALDBConnection.SqlConnection.BeginTransaction();

   try
   {
      string[] taleNames = new string[1];
      taleNames[0] = "DocNum";
      SqlParameter[] param = new SqlParameter[1];
      param[0] = new SqlParameter("@DocNumber", DocNumber);

      SqlHelper.FillDataset(transaction, CommandType.StoredProcedure, "spCheckDocNumber", DocNum, taleNames, param);
      transaction.Commit();
   }
   catch (Exception e)
   {
      transaction.Rollback();
   }

   return DocNum;
}

我的存储过程是

CREATE PROCEDURE spCheckDocNumber
    @DocNumber VARCHAR(MAX)
AS
BEGIN
   SELECT * FROM tblDocumentHeader WHERE DocumentNumber = @DocNumber
END

我需要知道如何将列表传递给存储过程以及如何在过程中检查列表。请帮忙

5 个答案:

答案 0 :(得分:6)

Crate一个Split函数,它根据char分割字符串。

GO
CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(8000))
RETURNS table
AS
RETURN (
    WITH splitter_cte AS (
      SELECT CHARINDEX(@sep, @s) as pos, 0 as lastPos
      UNION ALL
      SELECT CHARINDEX(@sep, @s, pos + 1), pos
      FROM splitter_cte
      WHERE pos > 0
    )
    SELECT SUBSTRING(@s, lastPos + 1,
                     case when pos = 0 then 80000
                     else pos - lastPos -1 end) as chunk
    FROM splitter_cte
  )
GO

SELECT *
  FROM dbo.Split(' ', 'the quick brown dog jumped over the lazy fox')
OPTION(MAXRECURSION 0);

然后使用Split函数打破逗号,然后您可以将输出用作表,然后连接到您要查找的表。

这可以很容易地拆分逗号分隔列表。然后你可以传入一个字符串,其中所有的hte值都用逗号分隔。

希望这有帮助!

答案 1 :(得分:1)

您可以使用以下代码: 这适用于SQL Server 2005(及更高版本):

create procedure IGetAListOfStrings
@List xml -- This will recevie a List of values
  as
begin
  -- You can load then in a temp table or use it as a subquery:
  create table #Values (ListValue nvarchar(20)); -- adjust nvarchar size
  INSERT INTO #Values
  SELECT DISTINCT params.p.value('.','varchar(20)') -- adjust nvarchar size
  FROM @List.nodes('/params/p') as params(p);
  ...
end

您必须使用如下参数调用此过程:

exec IGetAListOfValues
@List = '<params> <p>string1</p> <p>string2</p> </params>' -- xml parameter

nodes函数使用xPath表达式。在这种情况下,它是/params/p,因此XML使用<params>作为根,<p>作为元素。

有关详细信息,请参阅此答案: Passing List of values to stored procedure

答案 2 :(得分:0)

也许你可以在sql中使用In operator。有一些关于如何在http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm上使用它的教程。

答案 3 :(得分:0)

你必须自己编写代码,使用xml sql数据类型是一个不错的选择。

有关代码示例,请参阅:Passing an array of parameters to a stored procedure

答案 4 :(得分:0)

将XML发送到SQL

            List<string> lst = new List<string> {
                                                        "1",
                                                        "2",
                                                        "3"
                                                };

            XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); 
            namespaces.Add(string.Empty, string.Empty);
            StringBuilder sb = new StringBuilder();
            using (var sw = new StringWriter(sb)) //serialize
            {
                var serializer = new XmlSerializer(typeof (List<string>));
                serializer.Serialize(sw, lst, namespaces);
            }

现在,将SB作为参数发送给sql。

这就是全部。

不要使用CSV。