Найти конкретную запись столбца в неизвестной таблице в базе данных? - PullRequest
4 голосов
/ 28 апреля 2011

Мне известна эта тема ( Найти определенный столбец в неизвестной таблице в базе данных? ), и моя проблема довольно похожа. Запрос, который мне нужен, очень похож на этот (я думаю):

SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name LIKE '%watcher%'

Но мне нужен запрос, в котором имя столбца неизвестно, но я знаю, каким будет содержимое, и я хочу узнать, как называется таблица / столбец. (Я знаю, это звучит странно: - /). Я это возможно?

Ответы [ 6 ]

6 голосов
/ 29 апреля 2013

Попробуйте использовать ApexSQL Search - он ищет как объекты, так и данные, и это бесплатный инструмент, похожий на SQL Search из Red Gate.

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

4 голосов
/ 28 апреля 2011

Хорошо, я думаю, что для вашей проблемы вам понадобится динамический sql, поэтому сначала взгляните на эту ссылку . Если этого недостаточно, единственное решение, которое приходит на ум, включает в себя курсоры, поэтому я советую вам продолжать поиск других решений вашей проблемы. Тем не менее, вы можете попробовать следующий код (но вы должны сначала проверить его на небольших таблицах).

DECLARE @Query NVARCHAR(MAX), @Column NVARCHAR(100), @Table NVARCHAR(100)
DECLARE @Search NVARCHAR(100)
SET @Search = 'Your string'

CREATE TABLE #Results(Table_Name VARCHAR(100), Column_Name VARCHAR(100))

DECLARE Col CURSOR FOR
SELECT Table_Name, Column_Name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLLATION_NAME IS NOT NULL
ORDER BY TABLE_NAME, ORDINAL_POSITION

OPEN Col
FETCH NEXT FROM Col INTO @Table, @Column
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @Query = 'IF EXISTS (SELECT * FROM '+QUOTENAME(@Table)+' WHERE '+QUOTENAME(@Column)+'='''+@Search+''')
                    SELECT '''+@Table+''','''+@Column+''''

    INSERT INTO #Results
    EXEC sp_executesql @Query
    FETCH NEXT FROM Col INTO @Table, @Column
END
CLOSE Col
DEALLOCATE Col

SELECT * FROM #Results
2 голосов
/ 28 апреля 2011

Посмотрите на FREE Red-Gate инструмент под названием SQL Search , который делает это - он ищет во всей вашей базе данных любые типы строк.

enter image description here

enter image description here

Это отличный инструмент, необходимый для любого администратора БД или разработчика базы данных - я уже говорил, что это абсолютно БЕСПЛАТНО для использования влюбой вид использования ??

1 голос
/ 28 апреля 2011

Используя SQL Workbench / J , вы можете выполнить следующую инструкцию:

WbGrepData -searchValue=watcher

будет выполнять поиск по всем столбцам во всех (доступных) таблицах и возвращает все строки, в которых искомый термин найден хотя бы в одном столбце.

0 голосов
/ 14 марта 2014

Это тоже может помочь

DECLARE @columnName as varchar(100)
SET @columnName = 'ColumnName'

SELECT t.name AS Table, c.name AS Column,
ty.name AS Tipo, c.max_length AS Length
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
INNER JOIN sys.types ty ON c.system_type_id = ty.system_type_id
WHERE c.name LIKE @columnName
ORDER BY t.name, c.name
0 голосов
/ 29 ноября 2013

USE DBName

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 '%ColumName start from%'

ORDER BY schema_name, table_name;

...