如何在存储过程中拆分参数

时间:2018-06-20 02:59:47

标签: sql sql-server tsql stored-procedures

这是存储过程:

CREATE PROCEDURE [dbo].[StoredProcedure]
    @FILTERNAME varchar(100) = ''
AS
    IF @FILTERNAME <> ''
    BEGIN
        SELECT 
            CODE, NAMEen, NAMEkr 
        FROM 
            (SELECT 
                 OT.CODE, OT.NAMEen, OT.NAMEkr, OT.Sortkey 
             FROM 
                 OptionTable OT
             INNER JOIN 
                 ConditionTable CT ON OT.CODE = CT.CODE
             INNER JOIN 
                 MasterTable MT ON CT.DevCode = MT.DevCode  
                                AND CT.PlanCode = MT.PlanCode 
             WHERE 
                 MT.ProductName LIKE '%' + @FILTERNAME + '%'
             GROUP BY 
                 OT.CODE, OT.NAMEen, OT.NAMEkr, OT.Sortkey) TBL
        ORDER BY 
            Sortkey
    END

此存储过程从vb6中调用。我无法触摸vb6的代码,因此需要解决此问题。

直到现在,该参数类似于“ XXX”,但它将类似于“ A,BB,CCC,ZZZZ”。

我需要将参数的字符串除以,并按以下方式更改条件:当参数类似于此'A,BB,CCC,ZZZZ'时,请使用以下WHERE条件:

WHERE MT.ProductName LIKE '%' + A + '%'
   or MT.ProductName LIKE '%' + BB + '%'
   or MT.ProductName LIKE '%' + CCC + '%'
   or MT.ProductName LIKE '%' + ZZZZ + '%'

有人可以帮助我吗?谢谢。

3 个答案:

答案 0 :(得分:1)

  • 尝试

    CREATE proc [dbo].[StoredProcedure]
    @FILTERNAME varchar(100) = ''
    AS
    IF @FILTERNAME <> ''
    BEGIN
    
    declare @x XML 
    declare @Result as table(SingleCriteria varchar(max))
    SELECT @x = CAST('<A>'+ REPLACE(@FILTERNAME,',','</A><A>')+ '</A>' AS XML)
    INSERT INTO @Result            
    SELECT t.value('.', 'varchar(max)') AS inVal
    FROM @x.nodes('/A') AS x(t)
    
    
    
    SELECT 
        CODE, NAMEen, NAMEkr 
    FROM 
        (SELECT 
             OT.CODE, OT.NAMEen, OT.NAMEkr, OT.Sortkey 
         FROM 
             OptionTable OT
         INNER JOIN 
             ConditionTable CT ON OT.CODE = CT.CODE
         INNER JOIN 
             MasterTable MT ON CT.DevCode = MT.DevCode  
                            AND CT.PlanCode = MT.PlanCode 
        JOIN
             @Result RS ON 1=1
         WHERE 
             MT.ProductName LIKE '%' + RS.SingleCriteria + '%'
         GROUP BY 
             OT.CODE, OT.NAMEen, OT.NAMEkr, OT.Sortkey) TBL
    ORDER BY 
        Sortkey
    END
    

Convert Comma Separated String to Table

答案 1 :(得分:0)

You can use from This for split parameter

CREATE FUNCTION [dbo].[splitstring] ( @stringToSplit NVARCHAR(MAX),@SChar CHAR(1))
RETURNS
@returnList TABLE (ID INT identity(1,1),[Name] [nvarchar] (500))
AS
BEGIN

DECLARE @name NVARCHAR(255)
DECLARE @pos INT

WHILE CHARINDEX(@SChar, @stringToSplit) > 0
BEGIN
SELECT @pos  = CHARINDEX(@SChar, @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

答案 2 :(得分:0)

我对您的建议

因为SQL Server中没有现成的Split函数,所以我们需要创建用户定义的函数。

像这样:

CREATE FUNCTION Split (
      @InputString                  VARCHAR(8000),
      @Delimiter                    VARCHAR(50)
)

RETURNS @Items TABLE (
      Item                          VARCHAR(8000)
)

AS
BEGIN
      IF @Delimiter = ' '
      BEGIN
            SET @Delimiter = ','
            SET @InputString = REPLACE(@InputString, ' ', @Delimiter)
      END

      IF (@Delimiter IS NULL OR @Delimiter = '')
            SET @Delimiter = ','

--INSERT INTO @Items VALUES (@Delimiter) -- Diagnostic
--INSERT INTO @Items VALUES (@InputString) -- Diagnostic

      DECLARE @Item           VARCHAR(8000)
      DECLARE @ItemList       VARCHAR(8000)
      DECLARE @DelimIndex     INT

      SET @ItemList = @InputString
      SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
      WHILE (@DelimIndex != 0)
      BEGIN
            SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)
            INSERT INTO @Items VALUES (@Item)

            -- Set @ItemList = @ItemList minus one less item
            SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1, LEN(@ItemList)-@DelimIndex)
            SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
      END -- End WHILE

      IF @Item IS NOT NULL -- At least one delimiter was encountered in @InputString
      BEGIN
            SET @Item = @ItemList
            INSERT INTO @Items VALUES (@Item)
      END

      -- No delimiters were encountered in @InputString, so just return @InputString
      ELSE INSERT INTO @Items VALUES (@InputString)

      RETURN

END -- End Function
GO

---- Set Permissions
--GRANT SELECT ON Split TO UserRole1
--GRANT SELECT ON Split TO UserRole2
--GO 

上述功能this answer的来源

,然后尝试以下查询:

DECLARE @tbl table(name nvarchar(8000))

INSERT @tbl SELECT * FROM dbo.Split(@FILTERNAME, ',');

SELECT 
    CODE, NAMEen, NAMEkr 
FROM 
    (SELECT 
         OT.CODE, OT.NAMEen, OT.NAMEkr, OT.Sortkey 
     FROM 
         OptionTable OT
     INNER JOIN 
         ConditionTable CT ON OT.CODE = CT.CODE
     INNER JOIN 
         MasterTable MT ON CT.DevCode = MT.DevCode  
                        AND CT.PlanCode = MT.PlanCode 
     INNER JOIN @tbl tbl ON tbl.name LIKE '%' + MT.ProductName + '%' 
     GROUP BY 
         OT.CODE, OT.NAMEen, OT.NAMEkr, OT.Sortkey) TBL
ORDER BY 
    Sortkey
END