我的查询的where子句中存在问题。我的查询如下
select *
from languages
where languages.Language Like @languages
languages.Language
是逗号分隔的字符串。
例如
languages.Language
可能是'French, Spanish'
当@languages = 'french'
正常工作时。但是,在我的网页上,我希望能够选择多种语言,然后将其传递给存储过程,如此
@languages = 'French, Spanish'
如果languages.Language = 'French , Spanish'
这会有效,但这不起作用,因为法语和西班牙语之间可能有另一种语言,languages.Language
可能类似于'French, German, Spanish'
,当时不会返回任何结果正在搜索'French, Spanish'
。
我试过这样的事情
@languages = '%french% or languages.Language Like %Spanish%'
但是这并没有返回任何结果。
答案 0 :(得分:0)
我会考虑你存储语言字段的方式。您可以使用逗号分隔方法打开非规范化数据的可能性。如果那个设计只是为了你可以过滤一个查询,那么我会在存储过程中这样做。
CREATE PROCEDURE MyProcedure(
@LanguageList NVARCHAR(2000)
)
AS
SELECT
*
FROM
Languages
WHERE
Languages.Lanaguage IN (SELECT ID FROM dbo.MY_CreateStringTableFromCommaDelimitedString(@LanguageList))
你可以将它与下面的帮助表值函数一起使用。
CREATE FUNCTION [dbo].[MY_CreateStringTableFromCommaDelimitedString](@IDList NVARCHAR(1000))
RETURNS @T TABLE (ID NVARCHAR(100))
AS BEGIN
SELECT @IDList = REPLACE(@IDList, CHAR(9),'')
SELECT @IDList = REPLACE(@IDList, CHAR(10),'')
SELECT @IDList = REPLACE(@IDList, CHAR(13),'')
WHILE(CHARINDEX(',',@IDList)>0)BEGIN
INSERT INTO @T
SELECT LTRIM(RTRIM(SUBSTRING(@IDList,1,CHARINDEX(',',@IDList)-1)))
SET @IDList = SUBSTRING(@IDList,CHARINDEX(',',@IDList)+LEN(','),LEN(@IDList))
END
INSERT INTO @T SELECT LTRIM(RTRIM(@IDList))
RETURN
END