Как искать определенное имя столбца в одной таблице

Я искал этот вопрос в stackoverflow, но большинство вопросов немного глубже, чем то, что я хочу. Многие вопросы связаны с поиском таблицы с определенным именем столбца.

Я подключен к базе данных через SSMS. Я нашел таблицу, в которой хочу выполнить поиск по SELECT * FROM Item. В таблице Item я хочу найти все имена полей (или имя столбца) и select те, которые содержат определенную строку 'Size'. Я думал, что что-то вроде этого будет работать

Select * FROM Item WHERE column_name LIKE '%SIZE%'

Однако это не работает. Как указать его для поиска по всем именам столбцов, чтобы найти имена, содержащие «Размер»?

Спасибо.


person Jonathan Schroeder    schedule 23.07.2018    source источник
comment
Помогают ли ответы на аналогичный, более старый вопрос? Найти все таблицы, содержащие столбец с указанным именем - MS SQL-сервер   -  person Milan    schedule 23.07.2018
comment
Спасибо всем, все это было действительно полезно!   -  person Jonathan Schroeder    schedule 23.07.2018


Ответы (5)


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

USE [database_name]
GO 
SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%SIZE%'
   AND t.name = 'Item'
ORDER BY schema_name, table_name;

Вам потребуется правильное разрешение для любого SQL входа в систему, через который вы это сделаете.

person Edward    schedule 23.07.2018

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

SELECT * FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME ='zzzzz' and COLUMN_NAME like '%size%' 
person tallwithknees    schedule 23.07.2018

Это просматривает таблицу с именем Item для столбца с именем типа «SIZE»:

SELECT sch.COLUMN_NAME, sch.* 
FROM INFORMATION_SCHEMA.COLUMNS AS sch
WHERE TABLE_NAME = 'Item'  
  AND COLUMN_NAME LIKE '%SIZE%'

Это то, что вы хотели?

person Milan    schedule 23.07.2018

Я думаю, это то, что вы ищете, просто замените имя_базы_данных на имя вашей базы данных:

Declare @myQuery varchar(max) = ' Select ';
Declare @columnName varchar(max) = '';

Declare GetColumnNames Cursor
For
    SELECT COLUMN_NAME
    FROM database_Name.INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = N'Item'
        And database_Name.INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME like '%SIZE%'
OPEN GetColumnNames  

FETCH NEXT FROM GetColumnNames   
INTO @columnName

WHILE @@FETCH_STATUS = 0  
BEGIN
    Set @myQuery += @columnName + ', '

    FETCH NEXT FROM GetColumnNames   
    INTO @columnName
END   
CLOSE GetColumnNames;  
DEALLOCATE GetColumnNames;

-- Chop off the end character
SET @myQuery = LEFT(@myQuery, LEN(@myQuery) - 1) 

Set @myQuery += ' From Item'
exec(@myQuery)
person Mahal    schedule 23.07.2018

Вам придется использовать двухэтапный подход для достижения вашего конечного запроса.

Во-первых, вам нужно определить интересующие вас столбцы с помощью метаданных таблицы, которые вы можете получить либо из схемы sys, либо из таблиц INFORMATION_SCHEMA. Некоторые из предложенных ответов помогут вам получить эту информацию.

Затем вы будете использовать имена столбцов, которые вы определили на первом шаге, для создания фактического интересующего вас запроса. Если это разовая задача, которую вы выполняете, просто скопируйте и вставьте результаты из метаданных. запрос в новый запрос SELECT в качестве списка столбцов. Если вам нужно выполнить эту задачу программно или несколько раз, используя разные строки LIKE, вам следует потратить время на написание динамического SQL.

Когда вы все это завернете, это будет выглядеть примерно так:

--Step 1; The meta data part

DECLARE @ColumnList NVARCHAR(MAX)
       ,@SQL NVARCHAR(MAX)

SELECT 
  @ColumnList = COALESCE(@ColumnList+',','') + COLUMN_NAME
FROM 
  INFORMATION_SCHEMA.COLUMNS
WHERE 
  TABLE_SCHEMA = 'schema'
  AND 
  TABLE_NAME = 'TableName'
  AND 
  COLUMN_NAME LIKE '%SIZE%'

SELECT @ColumnList;

--Step 2; The dynamic SQL part

SET @SQL = 'SELECT ' + @ColumnList + ' FROM schema.TableName;';

EXECUTE sys.sp_executesql @SQL;
person Eric Brandt    schedule 23.07.2018