小编典典

SQL在表的所有列中搜索文本值

sql

我有一个包含许多列的巨大表,并且我知道该列有时带有一些特定的值’MyValue’。如何在一个包含“ MyValue”的特定表中选择所有行,而不管在哪一列中。

我在这里找到相关主题: 如何在SQL
Server数据库的任何位置找到值?

但是我的查询需要一个较小的大炮。我知道表名,就是“ MyTable”。我不需要搜索整个数据库。


阅读 171

收藏
2021-04-07

共1个答案

小编典典

要在一个简单的语句中不使用特殊过程的情况下执行此操作,可以将每一行转换为XML,然后在XML上使用XQuery来搜索该行中匹配的任何值。因此,例如:

declare @SearchValue as varchar(20)
set @SearchValue = 'MyValue'

select *
    --,(select MyTable.* for XML PATH (''),TYPE) AllColumns
    --,convert(nvarchar(255),(select MyTable.* for XML PATH (''),TYPE).query('for $item in * where $item=sql:variable("@SearchValue") return $item')) FoundColumns
from MyTable
where convert(nvarchar(255),(select MyTable.* for XML PATH (''),TYPE).query('for $item in * where $item=sql:variable("@SearchValue") return $item'))<>''

专为此任务设计的过程可能可以更有效地执行此过程,并可以利用索引等优势。老实说,我不会在没有太多考虑的情况下将其放入生产数据库解决方案中,但是作为一个综合的搜索工具,它是不错。我在40秒内对700,000条记录表进行了搜索。但是,如果我按每列分别进行过滤,它将几乎立即运行。还有一些注意事项:

  • 表的所​​有列都不能为XML标记添加空格或其他不友好的字符。我不知道如何获取带有空格的列名。也许有办法。
  • 筛选器必须用XQuery编写…这与SQL不完全相同。但是您可以使用=,<,>,甚至还有模式匹配。
  • 查询函数的参数必须是字符串文字。因此,您不能动态地构建字符串。这就是为什么我将变量用作搜索值的原因,但是如果需要,也可以使用sql:column(“ ColName”)。
  • 如果要搜索除字符串以外的其他类型,则您使用的搜索字符串必须与将字段转换为XML值的条件完全匹配。
2021-04-07