Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как найти в какой таблице и в каком колумне присутствует запись "абвгд"?  [new]
Admin_Vlad
Member

Откуда: Москва
Сообщений: 555
Как найти в какой таблице и в каком колумне присутствует запись "абвгд"?
28 дек 07, 06:09    [5105726]     Ответить | Цитировать Сообщить модератору
 Re: Как найти в какой таблице и в каком колумне присутствует запись "абвгд"?  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
Типа этого
set transaction isolation level read uncommitted
declare @value sql_variant
declare @TABLE_SCHEMA varchar(50), @TABLE_NAME varchar(50), @COLUMN_NAME varchar(50)
declare @sql varchar(8000)
set @value = 'Transit_Cargill_Australia_avia'
if object_id('tempdb..#q') is null
	create table #q (TABLE_SCHEMA varchar(255), TABLE_NAME varchar(255), COLUMN_NAME  varchar(255))
declare cur cursor local fast_forward for
	select TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME 
	from INFORMATION_SCHEMA.COLUMNS
	where DATA_TYPE not in('XML', 'image')
open cur      
while 1 = 1
begin
	fetch next from cur into @TABLE_SCHEMA, @TABLE_NAME, @COLUMN_NAME
	if @@fetch_status <> 0 break       
	print @sql
	set @sql = 'if exists(select * from [' + @TABLE_SCHEMA + '].[' + @TABLE_NAME + 
		'] where cast([' + @COLUMN_NAME + '] as varchar(8000)) = ''' + cast(@value as varchar(8000)) + 
		''') insert into #q select ''' + @TABLE_SCHEMA + ''', ''' + @TABLE_NAME  + ''', '''+  @COLUMN_NAME + ''''
	print @sql
	exec(@SQL)
end
close cur
deallocate cur
select * from #q
28 дек 07, 09:17    [5105883]     Ответить | Цитировать Сообщить модератору
 Re: Как найти в какой таблице и в каком колумне присутствует запись "абвгд"?  [new]
Admin_Vlad
Member

Откуда: Москва
Сообщений: 555
Ух ты! Спасибо.
28 дек 07, 11:04    [5106399]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как найти в какой таблице и в каком колумне присутствует запись "абвгд"?  [new]
Admin_Vlad
Member

Откуда: Москва
Сообщений: 555
Хранимая процедура для поиска строки по всей базе данных
CREATE PROCEDURE FindMyData_String
    @DataToFind NVARCHAR(4000),
    @ExactMatch BIT = 0
AS
SET NOCOUNT ON

DECLARE @Temp TABLE(RowId INT IDENTITY(1,1), SchemaName sysname, TableName sysname, ColumnName SysName, DataType VARCHAR(100), DataFound BIT)

    INSERT  INTO @Temp(TableName,SchemaName, ColumnName, DataType)
    SELECT  C.Table_Name,C.TABLE_SCHEMA, C.Column_Name, C.Data_Type
    FROM    Information_Schema.Columns AS C
            INNER Join Information_Schema.Tables AS T
                ON C.Table_Name = T.Table_Name
        AND C.TABLE_SCHEMA = T.TABLE_SCHEMA
    WHERE   Table_Type = 'Base Table'
            And Data_Type In ('ntext','text','nvarchar','nchar','varchar','char')


DECLARE @i INT
DECLARE @MAX INT
DECLARE @TableName sysname
DECLARE @ColumnName sysname
DECLARE @SchemaName sysname
DECLARE @SQL NVARCHAR(4000)
DECLARE @PARAMETERS NVARCHAR(4000)
DECLARE @DataExists BIT
DECLARE @SQLTemplate NVARCHAR(4000)

SELECT  @SQLTemplate = CASE WHEN @ExactMatch = 1
                            THEN 'If Exists(Select *
                                          From   ReplaceTableName
                                          Where  Convert(nVarChar(4000), [ReplaceColumnName])
                                                       = ''' + @DataToFind + '''
                                          )
                                     Set @DataExists = 1
                                 Else
                                     Set @DataExists = 0'
                            ELSE 'If Exists(Select *
                                          From   ReplaceTableName
                                          Where  Convert(nVarChar(4000), [ReplaceColumnName])
                                                       Like ''%' + @DataToFind + '%''
                                          )
                                     Set @DataExists = 1
                                 Else
                                     Set @DataExists = 0'
                            END,
        @PARAMETERS = '@DataExists Bit OUTPUT',
        @i = 1

SELECT @i = 1, @MAX = MAX(RowId)
FROM   @Temp

WHILE @i <= @MAX
    BEGIN
        SELECT  @SQL = REPLACE(REPLACE(@SQLTemplate, 'ReplaceTableName', QUOTENAME(SchemaName) + '.' + QUOTENAME(TableName)), 'ReplaceColumnName', ColumnName)
        FROM    @Temp
        WHERE   RowId = @i


        PRINT @SQL
        EXEC SP_EXECUTESQL @SQL, @PARAMETERS, @DataExists = @DataExists OUTPUT

        IF @DataExists =1
            UPDATE @Temp SET DataFound = 1 WHERE RowId = @i

        SET @i = @i + 1
    END

SELECT  SchemaName,TableName, ColumnName
FROM    @Temp
WHERE   DataFound = 1
GO


Запуск с параметрами:
exec FindMyData_string 'MyStringToFind', 0
15 ноя 13, 12:41    [15135091]     Ответить | Цитировать Сообщить модератору
 Re: Как найти в какой таблице и в каком колумне присутствует запись "абвгд"?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Convert(nVarChar(4000), [ReplaceColumnName]) - это поиск в первых 4000 символах, а не во "всей базе"
15 ноя 13, 12:49    [15135161]     Ответить | Цитировать Сообщить модератору
 Re: Как найти в какой таблице и в каком колумне присутствует запись "абвгд"?  [new]
Admin_Vlad
Member

Откуда: Москва
Сообщений: 555
Какую хранимую процедуру порекомендуете?
15 ноя 13, 12:50    [15135176]     Ответить | Цитировать Сообщить модератору
 Re: Как найти в какой таблице и в каком колумне присутствует запись "абвгд"?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Admin_Vlad
Какую хранимую процедуру порекомендуете?

Любую корректно написаную
15 ноя 13, 12:53    [15135203]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить