Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将两个字符串传递到存储过程中,并通过特定字符将其拆分以执行查询_C#_Asp.net_Sql Server_Stored Procedures_Split - Fatal编程技术网

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子句之后指定的所有值的唯一性。还有其他方法可以确保唯一性,我需要更多地了解您的模式,以确定最有效的方法。