我有一个工具,允许用户用不同的词标记帐户。它有助于跟踪帐户的信息,以便他们将来可以轻松地搜索标签。
例如,表中可能有 10 个帐户,它们都具有关键字 New、Payment 和 Yellow。
在我的 UI 上,我会输入多个关键字作为我的搜索,我需要它来返回找到这些字词的所有帐户。
问题是我正在使用存储过程并将字符串传递给搜索,例如
@var = Yellow,New,Payment
我不认为你可以这样做,WHERE COL IN(@VAR)
所以我不知道该怎么做。
我有一个工具,允许用户用不同的词标记帐户。它有助于跟踪帐户的信息,以便他们将来可以轻松地搜索标签。
例如,表中可能有 10 个帐户,它们都具有关键字 New、Payment 和 Yellow。
在我的 UI 上,我会输入多个关键字作为我的搜索,我需要它来返回找到这些字词的所有帐户。
问题是我正在使用存储过程并将字符串传递给搜索,例如
@var = Yellow,New,Payment
我不认为你可以这样做,WHERE COL IN(@VAR)
所以我不知道该怎么做。
前段时间我已经解决了这个问题,这就是我的做法,
Var 值将是
declare @Var varchar(50) = 'Yellow,New,Payment'
Select * from table A
where A.field in (Select * from dbo.fnSplit(@Var, ',') as i)
这是我的函数拆分代码
alter FUNCTION [dbo].[fnSplit](
@sInputList VARCHAR(8000) -- List of delimited items
, @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
) RETURNS @List TABLE (item VARCHAR(8000))
BEGIN
DECLARE @sItem VARCHAR(8000)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
BEGIN
SELECT
@sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX
(@sDelimiter,@sInputList,0)-1))), @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX
(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))
IF LEN(@sItem) > 0
INSERT INTO @List SELECT @sItem
END
IF LEN(@sInputList) > 0
INSERT INTO @List SELECT @sInputList -- Put the last item in
RETURN
END
假设您有以下表结构和数据:
DECLARE @DataSource TABLE
(
[AccountID] TINYINT
,[KeyWord] NVARCHAR(24)
)
INSERT INTO @DataSource ([AccountID], [KeyWord])
VALUES (1,'Yellow')
,(1,'Red')
,(1,'Male')
,(2,'Old')
,(3,'Yellow')
,(3,'Old')
,(4,'New')
,(4,'Famale')
并且您正在使用上面的变量过滤记录:
DECLARE @SearchKeyWords NVARCHAR(MAX) = 'Yellow,Male,Red'
您唯一需要的是将 CSV 列表转换为表格:
DECLARE @XML XML = N'<r><![CDATA[' + REPLACE(@SearchKeyWords, ',', ']]></r><r><![CDATA[') + ']]></r>'
SELECT DISTINCT RTRIM(LTRIM(Tbl.Col.value('.', 'nvarchar(250)')))
FROM @xml.nodes('//r') Tbl(Col)
因此,这是完整的工作示例:
DECLARE @DataSource TABLE
(
[AccountID] TINYINT
,[KeyWord] NVARCHAR(24)
)
INSERT INTO @DataSource ([AccountID], [KeyWord])
VALUES (1,'Yellow')
,(1,'Red')
,(1,'Male')
,(2,'Old')
,(3,'Yellow')
,(3,'Old')
,(4,'New')
,(4,'Famale')
DECLARE @SearchKeyWords NVARCHAR(MAX) = 'Yellow,Male,Red'
DECLARE @XML XML = N'<r><![CDATA[' + REPLACE(@SearchKeyWords, ',', ']]></r><r><![CDATA[') + ']]></r>'
;WITH KeyWords([KeyWord]) AS
(
SELECT DISTINCT RTRIM(LTRIM(Tbl.Col.value('.', 'nvarchar(250)')))
FROM @xml.nodes('//r') Tbl(Col)
)
SELECT DISTINCT [AccountID]
FROM @DataSource DS
INNER JOIN KeyWords KS
ON DS.[KeyWord] = KS.[KeyWord]