C# 将两个字符串传递到存储过程中,并通过特定字符将其拆分以执行查询
我有一个基本程序,基本上如下所示:C# 将两个字符串传递到存储过程中,并通过特定字符将其拆分以执行查询,c#,asp.net,sql-server,stored-procedures,split,C#,Asp.net,Sql Server,Stored Procedures,Split,我有一个基本程序,基本上如下所示: create procedure zsp_selectallupceans_list (@UPCList nvarchar(4000), @EANList nvarchar(4000)) as select * from data as dd where dd.UPC in (--myUPC list) or dd.EAN in (--myEAN list) SELECT * FROM dbo.splitstring
create procedure zsp_selectallupceans_list
(@UPCList nvarchar(4000),
@EANList nvarchar(4000))
as
select *
from data as dd
where dd.UPC in (--myUPC list) or dd.EAN in (--myEAN list)
SELECT * FROM dbo.splitstring('91,12,65,78,56,789')
where dd.UPC in (Select Name From splitstring(--myUpcList)) or dd.EAN in (Select Name from splitstring(--myEanList)
这是基本思想。现在,我需要以某种方式拆分我从C应用程序传递的字符串,UPC和EAN列表如下所示:
where dd.UPC in ('123','456','567') or dd.EAN in('1234','5542','412')
从C应用程序传递的UPCList参数如下所示:
'123,456,567' and eanlist: '1234,5542,412'
我找到了一个如下所示的方法:
CREATE FUNCTION dbo.splitstring
(@stringToSplit VARCHAR(MAX))
RETURNS
@returnList TABLE ([Name] [NVARCHAR](500))
AS
BEGIN
DECLARE @name NVARCHAR(255)
DECLARE @pos INT
WHILE CHARINDEX(',', @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(',', @stringToSplit)
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)
INSERT INTO @returnList
SELECT @name
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END
INSERT INTO @returnList
SELECT @stringToSplit
RETURN
END
此函数的用法如下所示:
create procedure zsp_selectallupceans_list
(@UPCList nvarchar(4000),
@EANList nvarchar(4000))
as
select *
from data as dd
where dd.UPC in (--myUPC list) or dd.EAN in (--myEAN list)
SELECT * FROM dbo.splitstring('91,12,65,78,56,789')
where dd.UPC in (Select Name From splitstring(--myUpcList)) or dd.EAN in (Select Name from splitstring(--myEanList)
其中输出是这些数字,它们被拆分并作为结果输出
现在我只需要以某种方式组合所有这些,以便基于传递的参数UPCList和EANList形成适当的where语句
有人能帮我解决这个问题吗?按如下方式更新存储的进程应该可以做到这一点:
create procedure zsp_selectallupceans_list
(
@UPCList nvarchar(4000),
@EANList nvarchar(4000)
)
as
select *
from data as dd
where dd.UPC in (SELECT * FROM dbo.SplitString(@UPCList)) OR
dd.EAN in (SELECT * FROM dbo.SplitString(@EANList))
按以下方式更新存储的进程应该可以做到这一点:
create procedure zsp_selectallupceans_list
(
@UPCList nvarchar(4000),
@EANList nvarchar(4000)
)
as
select *
from data as dd
where dd.UPC in (SELECT * FROM dbo.SplitString(@UPCList)) OR
dd.EAN in (SELECT * FROM dbo.SplitString(@EANList))
你几乎有了答案: 编译并保存splitstring函数,然后where子句将如下所示:
create procedure zsp_selectallupceans_list
(@UPCList nvarchar(4000),
@EANList nvarchar(4000))
as
select *
from data as dd
where dd.UPC in (--myUPC list) or dd.EAN in (--myEAN list)
SELECT * FROM dbo.splitstring('91,12,65,78,56,789')
where dd.UPC in (Select Name From splitstring(--myUpcList)) or dd.EAN in (Select Name from splitstring(--myEanList)
你几乎有了答案: 编译并保存splitstring函数,然后where子句将如下所示:
create procedure zsp_selectallupceans_list
(@UPCList nvarchar(4000),
@EANList nvarchar(4000))
as
select *
from data as dd
where dd.UPC in (--myUPC list) or dd.EAN in (--myEAN list)
SELECT * FROM dbo.splitstring('91,12,65,78,56,789')
where dd.UPC in (Select Name From splitstring(--myUpcList)) or dd.EAN in (Select Name from splitstring(--myEanList)
这是一个用于字符串拆分的基于XML的函数,该方法比您已经找到的子字符串方法快得多。还建议使用EXISTS而不是IN来提高性能。有关此方面的更多信息,请参阅
CREATE FUNCTION [dbo].[SplitString]
(
@string nvarchar(max),
@delimiter nvarchar(5)
) RETURNS @t TABLE
(
val nvarchar(500)
)
AS
BEGIN
declare @xml xml
set @xml = N'<root><r>' + replace(@string,@delimiter,'</r><r>') + '</r></root>'
insert into @t(val)
select
r.value('.','varchar(500)') as item
from @xml.nodes('//root/r') as records(r)
RETURN
END
这是一个用于字符串拆分的基于XML的函数,该方法比您已经找到的子字符串方法快得多。还建议使用EXISTS而不是IN来提高性能。有关此方面的更多信息,请参阅
CREATE FUNCTION [dbo].[SplitString]
(
@string nvarchar(max),
@delimiter nvarchar(5)
) RETURNS @t TABLE
(
val nvarchar(500)
)
AS
BEGIN
declare @xml xml
set @xml = N'<root><r>' + replace(@string,@delimiter,'</r><r>') + '</r></root>'
insert into @t(val)
select
r.value('.','varchar(500)') as item
from @xml.nodes('//root/r') as records(r)
RETURN
END
在C中,您可以使用DataTable作为传递给SP的表值参数:-然后在SP中有一个@tablevariable,您可以在中加入或子查询。我添加了另外一个答案,其中有两个性能改进建议。在C中,您可以使用DataTable作为传递给SP的表值参数:-然后有一个@SP中的tablevariable,您可以在中加入或子查询。我添加了另外一个答案,其中包含2条性能改进建议。or语句将确保如果找不到UPC的结果,则会找到EAN?如果找到与表中的UPC或表中的EAN相匹配的记录,它将作为您的过程的结果返回,所以是的。啊哈,好的,我知道了,如果过程返回了任何UPC/EAN,那么删除重复的UPC/EAN的最有效方法是什么?我不熟悉您数据库的模式,但是这个过程不应该返回重复的记录,也就是说,如果在UPC和EAN列表中都发现了一条记录,它只会在结果中出现一次。也就是说,如果表本身以某种方式允许重复,则可以使用SELECT DISTINCT语句代替常规SELECT语句,这将确保SELECT DISTINCT子句之后指定的所有值的唯一性。还有其他确保唯一性的方法,我需要更多地了解您的架构,以确定最有效的方法。OR语句将确保如果找不到UPC的结果,则会找到EAN?如果找到与表中的UPC或表中的EAN匹配的记录,则该记录将作为过程的结果返回,所以是的。啊哈,好的,我明白了,如果过程返回了任何重复的UPC/EAN,那么删除重复的UPC/EAN的最有效方法是什么?我不熟悉数据库的模式,但是这个过程不应该返回重复的记录,即-如果在UPC和EAN列表中都找到了一条记录,它只会在结果中出现一次。也就是说,如果表本身以某种方式允许重复,则可以使用SELECT DISTINCT语句代替常规SELECT语句,这将确保SELECT DISTINCT子句之后指定的所有值的唯一性。还有其他方法可以确保唯一性,我需要更多地了解您的模式,以确定最有效的方法。