Как мне написать запрос SQL, который ищет значение во всех столбцах и во всех таблицах в моей базе данных? - PullRequest
3 голосов
/ 01 апреля 2009

Я пытаюсь найти значение в своей базе данных Microsoft SQL Server 2008, но я не знаю, какой столбец или таблицу нужно искать. Я пытаюсь создать запрос, который будет просто просматривать все таблицы и все столбцы для моего значения.

Ответы [ 6 ]

3 голосов
/ 01 апреля 2009

Вы, вероятно, могли бы сделать это, используя динамический sql, используя sys.cols & sys.tables, у вас должна быть возможность создать запрос.

По всей вероятности, это будет чрезвычайно длительный запрос.

Я переосмыслил свой ответ, и если вы выполните запрос ниже, он сгенерирует несколько операторов sql, если вы запустите эти операторы, вы узнаете, какой столбец имеет желаемое значение. Просто замените [ваше значение здесь] на соответствующее значение. Это при условии, что вы цените varchar.

SELECT 'SELECT ''' + TABLE_NAME + '.' + column_name + 
   ''' FROM ' + TABLE_NAME + ' WHERE ' + 
   column_name + ' = ''[your value here]'''
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE DATA_TYPE = 'varchar';
1 голос
/ 01 апреля 2009

Я писал это некоторое время назад, не совсем уверен, что это было больше. Я помню, это было до того, как я узнал о sp_msForEachTable! Возможно, вам придется скорректировать переменные размеры (вы также можете сделать их максимальными, если вы используете 2005 +)

create proc SearchForValues (@search varchar(100))

as

Begin

declare @i int
declare @tbl varchar(50)
declare @col varchar(50)
declare @sql varchar(500)


create table #TEMP (id int identity (1,1), colname varchar(50), tblname varchar(50))

insert into #TEMP
select a.name, b.name from dbo.syscolumns a inner join
(
select * from dbo.sysobjects where xtype = 'U'
) b
on a.ID = b.ID

create table #SEARCHRESULT (TblName varchar(50), ColName varchar(50))


If isnumeric(@search) = 0 and @search is not null
begin
set @search = '''' + @search + ''''
end

set @i = 1

While @i <= (select max(id) from #TEMP)
   Begin
    select @tbl = tblname from #temp where ID = @i
    select @col = colname from #temp where ID = @i

    set @sql = 'If Exists(select *
                          from   [' + @tbl + ']
                          where  convert(varchar(500), [' + @col + ']) = ' + @search + '
                         )
                     Insert Into #SEARCHRESULT (TblName, ColName) Values(''' + @tbl + ''',''' + @col + ''')'

    execute (@sql)

    set @i = @i + 1
   End

drop table #TEMP
select * from #SEARCHRESULT
drop table #SEARCHRESULT
end
1 голос
/ 01 апреля 2009

Вы не можете сделать это в одном запросе. Вам нужно будет циклически просматривать информационные представления sys.tables и sys.columns и создавать несколько запросов (по одному для каждой таблицы), которые будут искать во всех полях ваше значение в очень длинной конструкции OR (по одному для каждого). поле).

0 голосов
/ 01 апреля 2009

Хранимая процедура sp_msForEachTable выполняет запрос для каждой таблицы. Это простая часть. Смотреть на все столбцы каждой таблицы должно быть гораздо сложнее. Сначала они, вероятно, имеют разные типы данных. Так что вы, вероятно, сможете выполнять только сравнение строк.

Но я уверен, что это возможно при использовании информации из системных таблиц и некоторых системных хранимых процедур. Я бы попытался найти решение для доступа к одному столбцу в одной таблице, где имя таблицы и имя столбца указаны только как строковые параметры. В этот момент на ум приходит Динамический SQL . Если вы решили это, стало бы относительно просто получить все имена таблиц со всеми именами столбцов из системных таблиц и объединить все вместе или поместить их в хранимую процедуру. Я хотел бы увидеть результат, если вы найдете решение.

0 голосов
/ 01 апреля 2009

Я рискую быть опущенным в этот прекрасный 1st april день, но я думаю, что в этом случае проще будет grep файл данных.

0 голосов
/ 01 апреля 2009

Вы не можете с простым SQL. Если вы не используете инструмент, который это делает (например, PL / SQL разработчик для Oracle).

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