Sql server 2008 &引用;例如;在SQL Server中搜索(,)字符串中分隔的参数

Sql server 2008 &引用;例如;在SQL Server中搜索(,)字符串中分隔的参数,sql-server-2008,Sql Server 2008,我正在做一个项目,我的脖子上挂着一个问题 我在SQL Server中声明了一个以(,)分隔的键字符串。我想使用LIKE关键字从某个表中搜索字符串中的基本键上的数据 我怎么做 比如说 @SearchKey='Game,Movie,Raw' 这些是我想用LIKE关键字在表中搜索的一些键如果我正确理解了您的问题,那么您可能会在AA、BG、FR、DE值中搜索像BG或DE这样的键。假设列表中没有起始逗号或尾随逗号,那么这应该适用于WHERE子句: WHERE ',' + ListOfKeys +

我正在做一个项目,我的脖子上挂着一个问题

我在SQL Server中声明了一个以(,)分隔的键字符串。我想使用
LIKE
关键字从某个表中搜索字符串中的基本键上的数据

我怎么做

比如说

@SearchKey='Game,Movie,Raw'    

这些是我想用LIKE关键字在表中搜索的一些键

如果我正确理解了您的问题,那么您可能会在
AA、BG、FR、DE
值中搜索像
BG
DE
这样的键。假设列表中没有起始逗号或尾随逗号,那么这应该适用于
WHERE
子句:

WHERE ',' + ListOfKeys + ',' LIKE '%,' + KeyToFind + ',%'

这对你有帮助吗?但我不建议这样做(出于性能原因)


还有其他几种可能的解决办法。这些都不是快速修复方法,根据您当前的设计,可能需要大量的工作,但潜在的性能提升将证明这样做是正确的

如果要搜索的数据存储在逗号分隔的列表中,那么最好的解决方案是修复数据模型并将数据适当地存储在相关表中

如果您的数据是一个长的varchar max类型字段,并且您正在搜索文档中的关键字,那么请查看如何进行全文搜索。这将比任何类似的语句执行得更好


可选地,如果您正在存储大型文档,并且希望搜索它们,请考虑使用文档数据库而不是关系数据库来访问项目的这一部分。它们在处理文档方面得到了更好的优化

我将创建一个表值函数,用于拆分字符串并从中创建表。 代码可能如下所示:

Create Function [dbo].[MyFunction]
(
    @List NVarChar(Max)
)
Returns @IDList TABLE 
(
    ID int 
)
With SchemaBinding
As
Begin
    Declare @myList NVarChar(Max);
    Declare @value NvarChar(Max);

    SET @myList = @List;

    While(Charindex(',', @myList) != 0)
    Begin
        SET @value = Substring(@myList , 1, Charindex(',', @myList) - 1);
        Insert Into @IDList (ID) Values (@value)
        SET @myList = Substring(@myList, Charindex(',', @myList) + 1, Len(@myList));
    End

    Insert Into @IDList (ID) Values (@myList)

    Return;
End

然后连接表。

您能给出一个这样的字符串和您想要生成的
LIKE
语句的示例吗?@SearchKey='Game,Movie,Raw'这些是我想用LIKE关键字在表中搜索的一些键。应该将它们拆分到另一个表中。请阅读第一个范式。@MartinSmith不,他想搜索这些值中的任何一个,而不是将多个值赋给一行。@Blorgbeard-啊,好的。所以习惯于看到逗号分隔的列表问题。在这种情况下,他们应该使用TVP,每个搜索短语一行,但键不是数字。这可能是“Gam,ra,Mo”,表中的数据是Game,Raw和Movies。@Kamlesh它仍然适用于“Gam,ra,Mo”-我只是假设数字哦,等等,你想让“Gam,ra,Mo”匹配“Game”,“Raw”和“Movies”?(从OP的编辑尝试中复制文本)“是的,你是对的,但我不明白你的意思。你能再详细一点吗。因为我想搜索表中的键和字符串形式的键”
Create Function [dbo].[MyFunction]
(
    @List NVarChar(Max)
)
Returns @IDList TABLE 
(
    ID int 
)
With SchemaBinding
As
Begin
    Declare @myList NVarChar(Max);
    Declare @value NvarChar(Max);

    SET @myList = @List;

    While(Charindex(',', @myList) != 0)
    Begin
        SET @value = Substring(@myList , 1, Charindex(',', @myList) - 1);
        Insert Into @IDList (ID) Values (@value)
        SET @myList = Substring(@myList, Charindex(',', @myList) + 1, Len(@myList));
    End

    Insert Into @IDList (ID) Values (@myList)

    Return;
End