这是存储过程:
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 + '%'
有人可以帮助我吗?谢谢。
答案 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
答案 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