我有一个字符串列表,我需要检查列表中的任何值是否包含在数据库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
我需要知道如何将列表传递给存储过程以及如何在过程中检查列表。请帮忙
答案 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。