Sql server 如何在表的所有列中查找特定单词

Sql server 如何在表的所有列中查找特定单词,sql-server,Sql Server,这是我的表结构和数据 create table tbl_test (id int identity(1,1), column1 nvarchar(50), coulmn2 nvarchar(50), coulmn3 nvarchar(50))-- Create a table insert into tbl_Test (column1,coulmn2,coulmn3) values ('qqGriffrr','Serjey','Maciej') insert into tbl_Test (c

这是我的表结构和数据

create table tbl_test
(id int identity(1,1),
column1 nvarchar(50),
coulmn2 nvarchar(50),
coulmn3 nvarchar(50))-- Create a table 

insert into tbl_Test (column1,coulmn2,coulmn3) values
('qqGriffrr','Serjey','Maciej')
insert into tbl_Test (column1,coulmn2,coulmn3) values('King','Fisher','Ajay')
insert into tbl_Test (column1,coulmn2,coulmn3) values('Paul','ssGriffdd','Serjey')
insert into tbl_Test (column1,coulmn2,coulmn3) values('King','Fisher','xxGriffzzz')
我正在寻找这样的方法,而且它正在发挥作用

select * from tbl_test where 'Griff'
IN(column1 ,column2 ,column3)

select * from tbl_test where column1 like '%Griff%'
OR coulmn2 like '%Griff%'
OR coulmn3 like '%Griff%'  
我正在寻找一些整洁的方式,因此,如果列的数量不会增加,我就不必包含这么多的
或类似的
子句。告诉我解决这个问题的最佳方法


谢谢

如果您能够使用全文搜索,您可以这样做:

select *
from test_table
where CONTAINS(*, '"blablabla"')

如果您能够使用全文搜索,您可以这样做:

select *
from test_table
where CONTAINS(*, '"blablabla"')

如果只需要一个表,请删除外部循环:

DECLARE @TableName sysname, @ColName sysname
DECLARE @Find sysname
DECLARE @sql nvarchar(4000)
SET @Find = N'sometext'
DECLARE cTables CURSOR FOR SELECT name from dbo.sysobjects where Category = 0 AND type NOT IN (N'F', N'FN', N'IF', N'TF', N'P', N'TR', N'V', N'K') 
OPEN cTables
FETCH NEXT FROM cTables INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE cColumns CURSOR FOR SELECT column_name FROM information_schema.columns WHERE table_name = @TableName AND DATA_TYPE NOT IN ('Image', 'bit', 'int', 'datetime', 'ntext', 'varbinary')

    OPEN cColumns
    FETCH NEXT FROM cColumns INTO @ColName

    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @sql = N'SET NOCOUNT ON
DECLARE @Value sysname, @NewValue sysname
IF EXISTS (SELECT 1 FROM [' + @TableName + N'] WHERE [' + @ColName + N'] LIKE N''%'+ @Find + '%'')
BEGIN
    SELECT @Value = [' + @ColName + N'] FROM [' + @TableName + N'] WHERE [' + @ColName + N'] LIKE N''%' + @Find + '%''
    SELECT ''' + @ColName + N''' [Column], ''' + @TableName + N''' [Table], [' + @ColName + N'] [ValueFound], * FROM [' + @TableName + N'] WHERE [' + @ColName + N'] LIKE N''%' + @Find + '%''
END
'
--      PRINT @sql
        EXEC sp_sqlexec @sql

        FETCH NEXT FROM cColumns INTO @ColName
    END

    CLOSE cColumns;
    DEALLOCATE cColumns;

    FETCH NEXT FROM cTables INTO @TableName
END

CLOSE cTables;
DEALLOCATE cTables;
编辑为仅使用选定的表:

DECLARE @ColName sysname
DECLARE @Find sysname
DECLARE @sql nvarchar(4000), @TableName sysname
SET @Find = N'sometext'
SET @TableName = N'YourTable'

DECLARE cColumns CURSOR FOR SELECT column_name FROM information_schema.columns WHERE table_name = @TableName AND DATA_TYPE NOT IN ('Image', 'bit', 'int', 'datetime', 'ntext', 'varbinary')

OPEN cColumns
FETCH NEXT FROM cColumns INTO @ColName

WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @sql = N'SET NOCOUNT ON
DECLARE @Value sysname, @NewValue sysname
IF EXISTS (SELECT 1 FROM [' + @TableName + N'] WHERE [' + @ColName + N'] LIKE N''%'+ @Find + '%'')
BEGIN
    SELECT @Value = [' + @ColName + N'] FROM [' + @TableName + N'] WHERE [' + @ColName + N'] LIKE N''%' + @Find + '%''
    SELECT ''' + @ColName + N''' [Column], ''' + @TableName + N''' [Table], [' + @ColName + N'] [ValueFound], * FROM [' + @TableName + N'] WHERE [' + @ColName + N'] LIKE N''%' + @Find + '%''
END
'
--  PRINT @sql
    EXEC sp_sqlexec @sql

    FETCH NEXT FROM cColumns INTO @ColName
END

CLOSE cColumns;
DEALLOCATE cColumns;

如果只需要一个表,请删除外部循环:

DECLARE @TableName sysname, @ColName sysname
DECLARE @Find sysname
DECLARE @sql nvarchar(4000)
SET @Find = N'sometext'
DECLARE cTables CURSOR FOR SELECT name from dbo.sysobjects where Category = 0 AND type NOT IN (N'F', N'FN', N'IF', N'TF', N'P', N'TR', N'V', N'K') 
OPEN cTables
FETCH NEXT FROM cTables INTO @TableName

WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE cColumns CURSOR FOR SELECT column_name FROM information_schema.columns WHERE table_name = @TableName AND DATA_TYPE NOT IN ('Image', 'bit', 'int', 'datetime', 'ntext', 'varbinary')

    OPEN cColumns
    FETCH NEXT FROM cColumns INTO @ColName

    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @sql = N'SET NOCOUNT ON
DECLARE @Value sysname, @NewValue sysname
IF EXISTS (SELECT 1 FROM [' + @TableName + N'] WHERE [' + @ColName + N'] LIKE N''%'+ @Find + '%'')
BEGIN
    SELECT @Value = [' + @ColName + N'] FROM [' + @TableName + N'] WHERE [' + @ColName + N'] LIKE N''%' + @Find + '%''
    SELECT ''' + @ColName + N''' [Column], ''' + @TableName + N''' [Table], [' + @ColName + N'] [ValueFound], * FROM [' + @TableName + N'] WHERE [' + @ColName + N'] LIKE N''%' + @Find + '%''
END
'
--      PRINT @sql
        EXEC sp_sqlexec @sql

        FETCH NEXT FROM cColumns INTO @ColName
    END

    CLOSE cColumns;
    DEALLOCATE cColumns;

    FETCH NEXT FROM cTables INTO @TableName
END

CLOSE cTables;
DEALLOCATE cTables;
编辑为仅使用选定的表:

DECLARE @ColName sysname
DECLARE @Find sysname
DECLARE @sql nvarchar(4000), @TableName sysname
SET @Find = N'sometext'
SET @TableName = N'YourTable'

DECLARE cColumns CURSOR FOR SELECT column_name FROM information_schema.columns WHERE table_name = @TableName AND DATA_TYPE NOT IN ('Image', 'bit', 'int', 'datetime', 'ntext', 'varbinary')

OPEN cColumns
FETCH NEXT FROM cColumns INTO @ColName

WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @sql = N'SET NOCOUNT ON
DECLARE @Value sysname, @NewValue sysname
IF EXISTS (SELECT 1 FROM [' + @TableName + N'] WHERE [' + @ColName + N'] LIKE N''%'+ @Find + '%'')
BEGIN
    SELECT @Value = [' + @ColName + N'] FROM [' + @TableName + N'] WHERE [' + @ColName + N'] LIKE N''%' + @Find + '%''
    SELECT ''' + @ColName + N''' [Column], ''' + @TableName + N''' [Table], [' + @ColName + N'] [ValueFound], * FROM [' + @TableName + N'] WHERE [' + @ColName + N'] LIKE N''%' + @Find + '%''
END
'
--  PRINT @sql
    EXEC sp_sqlexec @sql

    FETCH NEXT FROM cColumns INTO @ColName
END

CLOSE cColumns;
DEALLOCATE cColumns;

我找到了一个看起来不错的。给你

在SQL Server表的所有列中搜索和查找字符串值
我找到了一个看起来不错的。给你

在SQL Server表的所有列中搜索和查找字符串值

您应该看一下,这是一个适用于同一表中多个列的单个索引,这是一个适用于同一表中多个列的单个索引。如果其中一列包含
NULL
值,则此操作将失败。可以使用coalesec或isnull函数。例如,如果
col2='ZZZGri'和col3='ffZZZ'
用户在所有表中搜索同一字符串,则会给出错误的结果column@harshpareek你的问题简单明了正在工作,但应以这样的方式写入:如果任何列包含NULL,则不会失败。如果其中一列包含
NULL
值,则将失败。可以使用coalesec或isnull函数。例如,如果
col2='ZZZGri'和col3='ffZZZ'
用户在所有列中搜索同一字符串,则会给出错误的结果column@harshpareek你的查询很简单,而且工作正常,但应以这样的方式编写:如果任何列包含nullfull text search,则不会失败。不可能进行全文搜索:(那么只有动态sql我认为全文搜索是不可能的。:(那么只有动态sql我认为你的东西太大了,不能满足要求。@我知道,但这是一个非常强大的代码的一部分,我必须替换整个数据库中的值,我想与大家分享:)您的东西太大了,无法满足需求。@我知道,但这是一个相当强大的代码的一部分,我必须替换整个数据库中的值,我想与大家分享:)