Подтвердить что ты не робот

SQL Server SELECT, где любой столбец содержит "x",

Используя SQL Server 2008, скажем, у меня есть таблица с именем testing с 80 столбцами, и я хочу найти значение под названием foo.

Я могу сделать:

SELECT * 
FROM testing 
WHERE COLNAME = 'foo'

Возможно ли, что я могу запросить все 80 столбцов и вернуть все результаты, где foo содержится в любом из 80 столбцов?

Спасибо заранее.

4b9b3361

Ответ 1

Первый метод (протестирован) Сначала получите список столбцов в строковой переменной, разделенных запятыми, а затем вы можете искать "foo" с помощью этой переменной с помощью IN

Проверьте хранимую процедуру ниже, которая сначала получает столбцы, а затем ищет строку:

DECLARE @TABLE_NAME VARCHAR(128)
DECLARE @SCHEMA_NAME VARCHAR(128)

-----------------------------------------------------------------------

-- Set up the name of the table here :
SET @TABLE_NAME = 'testing'
-- Set up the name of the schema here, or just leave set to 'dbo' :
SET @SCHEMA_NAME = 'dbo'

-----------------------------------------------------------------------

DECLARE @vvc_ColumnName VARCHAR(128)
DECLARE @vvc_ColumnList VARCHAR(MAX)

IF @SCHEMA_NAME =''
  BEGIN
  PRINT 'Error : No schema defined!'
  RETURN
  END

IF NOT EXISTS (SELECT * FROM sys.tables T JOIN sys.schemas S
      ON T.schema_id=S.schema_id
      WHERE [email protected]_NAME AND [email protected]_NAME)
  BEGIN
  PRINT 'Error : The table '''[email protected]_NAME+''' in schema '''+
      @SCHEMA_NAME+''' does not exist in this database!' 
  RETURN
 END

DECLARE TableCursor CURSOR FAST_FORWARD FOR
SELECT   CASE WHEN PATINDEX('% %',C.name) > 0 
     THEN '['+ C.name +']' 
     ELSE C.name 
     END
FROM     sys.columns C
JOIN     sys.tables T
ON       C.object_id  = T.object_id
JOIN     sys.schemas S
ON       S.schema_id  = T.schema_id
WHERE    T.name    = @TABLE_NAME
AND      S.name    = @SCHEMA_NAME
ORDER BY column_id


SET @vvc_ColumnList=''

OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @vvc_ColumnName

WHILE @@FETCH_STATUS=0
  BEGIN
   SET @vvc_ColumnList = @vvc_ColumnList + @vvc_ColumnName

    -- get the details of the next column
   FETCH NEXT FROM TableCursor INTO @vvc_ColumnName

  -- add a comma if we are not at the end of the row
   IF @@FETCH_STATUS=0
    SET @vvc_ColumnList = @vvc_ColumnList + ','
   END

 CLOSE TableCursor
 DEALLOCATE TableCursor

-- Now search for `foo`


SELECT *
FROM testing 
WHERE 'foo' in (@vvc_ColumnList );

Второй метод В sql-сервере вы можете получить идентификатор объекта таблицы, а затем используя этот идентификатор объекта, вы можете получить столбцы. В этом случае это будет следующим:

Шаг 1: Сначала получите идентификатор объекта таблицы

select * from sys.tables order by name    

Шаг 2: Теперь получите столбцы вашей таблицы и выполните поиск в нем:

 select * from testing where 'foo' in (select name from sys.columns  where  object_id =1977058079)

Примечание: object_id - это то, что вы получаете на первом этапе для вашей соответствующей таблицы.

Ответ 2

Вы можете использовать in:

SELECT *
FROM testing 
WHERE 'foo' in (col1, col2, col3, . . . );

Ответ 3

Вы можете использовать это, и вы можете динамически получить имена столбцов и передать их в предложение IN, создав строку sql и выполнив ее с помощью execute sp_executesql.

declare @sql nvarchar(2100)
declare @cols nvarchar(2000)
declare @toSearch nvarchar(200)
declare @tableName nvarchar(200)
set @tableName = 'tbltemp'
set @toSearch = '5' 
set @cols =(
 SELECT LEFT(column_name, LEN(column_name) - 1)
FROM (
    SELECT column_name + ', '
    FROM INFORMATION_SCHEMA.COLUMNS where table_name = @tableName
    FOR XML PATH ('')
  ) c (column_name )
)
set @sql = 'select * from tbltemp where '''+ @toSearch + '''  in (' + @cols + ')';  
execute sp_executesql @sql

Ответ 4

Я взял идею из ответа Убейда Ашрафа, но заставил ее работать. Просто измените MyTableName здесь:

SELECT STUFF((
    SELECT ', ' + c.name 
    FROM sys.columns  c
    JOIN sys.types AS t ON c.user_type_id=t.user_type_id
    WHERE t.name != 'int'  AND t.name != 'bit' AND t.name !='date' AND t.name !='datetime'
        AND object_id =(SELECT object_id FROM sys.tables WHERE name='MyTableName')
    FOR XML PATH('')),1,2,'')

Вы можете настроить его под свои нужды и добавить или удалить условия из столбца where (часть 't.name! =' Int 'и t.name! =' Bit 'и т.д.), Например, добавить' t.name! = ' uniqueidentifier '', чтобы избежать получения Conversion failed when converting the varchar value 'myvalue' to data type int тип ошибок..

Затем скопируйте и вставьте результат в этот запрос (иначе это не сработало):

SELECT * from MyTableName where 'foo' in (COPY PASTE PREVIOUS QUERY RESULT INTO HERE)

Ответ 5

Я думаю, что это один из лучших способов сделать это

SELECT * FROM sys.columns  a
inner join 
(
SELECT object_id
FROM sys.tables 
where 
type='U'--user table
and name like 'testing' 
) b on a.object_id=b.object_id
WHERE a.name like '%foo%'