Подстановочный знак SQL вместо ключа в операторе SELECT - PullRequest
3 голосов
/ 30 марта 2012

Могу ли я аккуратно выполнить:

SELECT * 
FROM tablename 
WHERE * LIKE '%something%';

Без необходимости:

SELECT * 
FROM tablename 
WHERE ColA LIKE '%something%' 
   OR ColB LIKE '%something%' ...;

При запуске SQL Server 2008 я получаю сообщение об ошибке:

"Невозможно использовать предикат CONTAINS или FREETEXT для таблицы или индексированного представления 'имя таблицы', поскольку оно не проиндексировано в полнотекстовом формате.

У меня нет полнотекстового индекса:)

Ответы [ 6 ]

3 голосов
/ 30 марта 2012

Чтобы построить идею @Bob Probst, вы можете попробовать динамический SQL следующим образом:

-- Set these!
declare @tableName nvarchar(128)= 'MyTableName'
declare @searchString nvarchar(max)= '%something%'

-- Build SQL query
declare @sql nvarchar(max)
select @sql = isnull(@sql + 'or ', 'select * from ' + @tableName + ' where ' )
    + '[' + column_name + '] like ''' + replace(@searchString, '''', '''''') + ''' '
from information_schema.columns
where table_name = @tableName
    -- Could use this where clause for only comparing string fields (or eliminating image and such)
    --and data_type in ('varchar', 'char','nvarchar', 'nchar')

-- Run SQL query
print (@sql) -- For debug
exec (@sql)
2 голосов
/ 30 марта 2012

Вы можете написать это так:

select 'select * from dbo.ACCOUNT_DIMENSION where '
union all
select c.name+' like ''%something%'' or '
from sys.tables t
inner join sys.columns c on (t.object_id=c.object_id)
where t.name = 'ACCOUNT_DIMENSION'
union all
select '1=1'
1 голос
/ 30 марта 2012

Нет.Это невозможно.Вы должны написать имена полей.

0 голосов
/ 30 марта 2012

Без полнотекстового индекса единственный способ сделать это динамически - с помощью динамически созданного оператора;

declare @sql varchar(max) = 'select * from tablename where 1=0'

select @sql += ' or ' + quotename(column_name) + ' like ''%something%'''
from information_schema.columns
where TABLE_NAME = 'tablename'
and data_type in ('char', 'varchar', 'nchar', 'nvarchar')

exec(@sql)
0 голосов
/ 30 марта 2012

Вы должны иметь возможность использовать знак + для связывания ColA и ColB:

SELECT 
   * 
FROM 
   tablename 
WHERE 
   ColA+ColB Like '%something%'
0 голосов
/ 30 марта 2012

Как звучит СОДЕРЖИТ * звук?

Use AdventureWorks2008R2;
GO
SELECT Name, Color FROM Production.Product
WHERE CONTAINS((Name, Color), 'Red');

* Для этого требуются полнотекстовые индексы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...