sql server where子句在传递多个值时出现问题

时间:2014-11-25 19:29:37

标签: sql-server

我的查询的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%' 

但是这并没有返回任何结果。

1 个答案:

答案 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