这是一个简单的问题,我似乎无法想到解决方案.
我在我的存储过程中定义了这个:
@communityDesc varchar(255) = NULL
Run Code Online (Sandbox Code Playgroud)
@communityDesc是"aaa,bbb,ccc"
在我的实际查询中,我正在尝试使用 IN
WHERE AREA IN (@communityDesc)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为我的逗号在字符串内,而不是像"aaa","bbb","ccc"
所以我的问题是,我能对@communityDesc做些什么,所以它可以用我的IN语句,比如重新格式化字符串?
本文可以帮助您解决问题:
http://sqlperformance.com/2012/07/t-sql-queries/split-strings
在这篇文章中,Aaron Bertrand正在撰写有关您的问题的文章.这真的很长很详细.
单向是这样的:
CREATE FUNCTION dbo.SplitStrings_XML
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
);
GO
Run Code Online (Sandbox Code Playgroud)
使用此功能,您只需拨打:
WHERE AREA IN (SELECT Item FROM dbo.SplitStrings_XML(@communityDesc, N','))
Run Code Online (Sandbox Code Playgroud)
希望这可以帮到你.
首先,您最多创建一个函数来分割字符串,例如以下代码
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
Run Code Online (Sandbox Code Playgroud)
那么你可以使用这个函数是你的查询像这样
WHERE AREA IN (dbo.splitstring(@communityDesc))
Run Code Online (Sandbox Code Playgroud)