代码之家  ›  专栏  ›  技术社区  ›  User987

将两个字符串传递到存储过程中,并通过特定字符将其拆分以执行查询

  •  1
  • User987  · 技术社区  · 6 年前

    我的基本程序如下:

    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)
    

    这是基本的想法。现在,我需要以某种方式拆分从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
    

    这个函数的用法如下:

    SELECT * FROM dbo.splitstring('91,12,65,78,56,789')
    

    其中输出的是这些数字,它们被拆分并作为结果输出。

    现在我只需要将所有这些组合起来,这样就可以基于传递的参数UPCList和EANList形成一个合适的where语句

    有人能帮我解决这个问题吗?

    3 回复  |  直到 6 年前
        1
  •  2
  •   user8061994 user8061994    6 年前

    按如下方式更新存储过程可以做到这一点:

    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))
    
        2
  •  2
  •   Code Ranger    6 年前

    你差不多有答案了: 编译并保存splitstring函数,然后where子句将如下所示:

    where dd.UPC in (Select Name From splitstring(--myUpcList)) or dd.EAN in (Select Name from splitstring(--myEanList)
    
        3
  •  2
  •   Dave C    6 年前

    这里有一个基于XML的字符串分割函数,这个方法比 SUBSTRING 方法已找到。也建议使用 EXISTS 而不是 IN 有关性能改进,请参见 here 了解更多信息。

    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
    

    使用:

    SELECT *
    FROM data t
    WHERE EXISTS (SELECT 1 FROM dbo.SplitString(@UPCList,',') S1 WHERE t.UPC=S1.val) 
       OR EXISTS (SELECT 1 FROM dbo.SplitString(@EANList,',') S2 WHERE t.EAN=S2.val)