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

时间:2015-05-22 11:10:59

标签: 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 (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%'  

我正在寻找一些简洁的方法,因此如果没有列增加,我不必包含这么多OR and Like子句。所以告诉我解决它的最佳方法。

感谢

4 个答案:

答案 0 :(得分:3)

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

size()

答案 1 :(得分:1)

更通用一点,如果只需要一个表,则删除外部循环:

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;

答案 2 :(得分:0)

select * 
from tbl_test
where column1+column2 +column3 like '%Griff%'

答案 3 :(得分:0)

我发现了一个看起来不错的东西。在这里。

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

CREATE PROCEDURE sp_FindStringInTable @stringToFind VARCHAR(100), @schema sysname, @table sysname
AS

DECLARE @sqlCommand VARCHAR(8000)
DECLARE @where VARCHAR(8000)
DECLARE @columnName sysname
DECLARE @cursor VARCHAR(8000)

BEGIN TRY
   SET @sqlCommand = 'SELECT * FROM [' + @schema + '].[' + @table + '] WHERE'
   SET @where = ''

   SET @cursor = 'DECLARE col_cursor CURSOR FOR SELECT COLUMN_NAME
   FROM ' + DB_NAME() + '.INFORMATION_SCHEMA.COLUMNS
   WHERE TABLE_SCHEMA = ''' + @schema + '''
   AND TABLE_NAME = ''' + @table + '''
   AND DATA_TYPE IN (''char'',''nchar'',''ntext'',''nvarchar'',''text'',''varchar'')'

   EXEC (@cursor)

   OPEN col_cursor   
   FETCH NEXT FROM col_cursor INTO @columnName   

   WHILE @@FETCH_STATUS = 0   
   BEGIN   
       IF @where <> ''
           SET @where = @where + ' OR'

       SET @where = @where + ' [' + @columnName + '] LIKE ''' + @stringToFind + ''''
       FETCH NEXT FROM col_cursor INTO @columnName   
   END   

   CLOSE col_cursor   
   DEALLOCATE col_cursor 

   SET @sqlCommand = @sqlCommand + @where
   --PRINT @sqlCommand
   EXEC (@sqlCommand) 
END TRY
BEGIN CATCH
   PRINT 'There was an error. Check to make sure object exists.'
   IF CURSOR_STATUS('variable', 'col_cursor') <> -3
   BEGIN
       CLOSE col_cursor   
       DEALLOCATE col_cursor 
   END
END CATCH 

以这种方式打电话

EXEC sp_FindStringInTable 'Irv%', 'Person', 'Address'