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

Откуда:
Сообщений: 36
где-то в базе SQL есть значение в какой таблице неизвестно
как найти? есть какой-то общий поиск?
чтобы завести значение а SQL сам все свои таблицы пересмотрел?
20 сен 12, 14:53    [13196532]     Ответить | Цитировать Сообщить модератору
 Re: поиск в SQL  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
http://www.red-gate.com/products/sql-development/sql-search/
20 сен 12, 15:00    [13196618]     Ответить | Цитировать Сообщить модератору
 Re: поиск в SQL  [new]
aatm
Member

Откуда:
Сообщений: 36
утилита может искать значения в таблицах? цифры не находит, текст кириллицей тоже...
может какой-то синтаксис для строки поиска есть?
20 сен 12, 15:25    [13196860]     Ответить | Цитировать Сообщить модератору
 Re: поиск в SQL  [new]
RockMan
Member

Откуда:
Сообщений: 184
aatm
где-то в базе SQL есть значение в какой таблице неизвестно
как найти? есть какой-то общий поиск?
чтобы завести значение а SQL сам все свои таблицы пересмотрел?


Поиск фрагмента строки во всех таблицах
20 сен 12, 16:04    [13197200]     Ответить | Цитировать Сообщить модератору
 Re: поиск в SQL  [new]
mike909
Member

Откуда:
Сообщений: 662
aatm
утилита может искать значения в таблицах? цифры не находит, текст кириллицей тоже...
может какой-то синтаксис для строки поиска есть?

+ В качестве прикола

declare @val SQL_VARIANT, @stmt nvarchar(max)

set @val = cast(4958345000 as bigint)
--set @val = N'DX200'

SELECT @stmt = 
  (
    SELECT 
      CASE ROW_NUMBER() OVER(ORDER BY c.[object_id], c.column_id) WHEN 1 THEN '' 
        ELSE char(13) + char(10) + 'UNION ALL' + char(13) + char(10) 
      end +
      'SELECT ''' + n.[TableName] + ''' as [TableName],''' + n.[ColName] + ''' as [ColName]' + char(13) + char(10) +
      'WHERE exists( select 1 from ' + n.[TableName] + ' where ' + n.[ColName] + ' = ' + 
      sys.fn_sqlvarbasetostr(@val) + ')'
    from sys.columns as c
    inner join sys.tables as t on
      t.[object_id] = c.[object_id]
    inner join sys.schemas as s on
      s.[schema_id] = t.[schema_id]
    inner join sys.types as tp on
      c.user_type_id = tp.user_type_id
    cross apply(
      select QUOTENAME(s.[name]) + '.' + QUOTENAME(t.name) as [TableName], QUOTENAME(c.name) as [ColName]
    ) as n
    where tp.name = cast(SQL_VARIANT_PROPERTY( @val, 'BaseType') as sysname)
    FOR XML PATH(''), TYPE
  ).value('text()[1]', 'nvarchar(max)')

print @stmt
--exec(@stmt)
20 сен 12, 16:17    [13197284]     Ответить | Цитировать Сообщить модератору
 Re: поиск в SQL  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
aatm
утилита может искать значения в таблицах? цифры не находит, текст кириллицей тоже...
может какой-то синтаксис для строки поиска есть?

Почитайте описание. Утилита ищет в описаниях объектов, а не внутри таблиц.

Насколько я понимаю, для вашей задачи не подходит.

Для вашей задачи можно в курсоре перебрать все колонки всех таблиц и сделать селект.

Делали такое для uniqueidentifier, можно переделать для остальных типов колонок:

declare @IDSearch varchar(max) = '06CD3483-C6E8-44F1-9858-87F805E5D96E'; --ID который ищем

DECLARE CurTableName CURSOR FOR
select distinct obj.name as table_name, obj.object_id as IDTable
from sys.columns col
      inner join sys.objects obj on col.object_id=obj.object_id
where system_type_id=36
        and type_desc='USER_TABLE';

declare              
    @tablename varchar(max),
    @tableid int,
    @table_select nvarchar(max),
    @srt_column varchar(max);

OPEN CurTableName;
WHILE 1=1
BEGIN
   set @srt_column='';
   FETCH CurTableName INTO @tablename,@tableid;
   IF @@FETCH_STATUS <> 0 BREAK;
         select @srt_column= @srt_column + ' or ['+col.name+']='''+@IDSearch + '''' 
           from sys.columns col 
          where col.object_id=@tableid 
            and system_type_id=36; --Тип [uniqueidentifier]
            
		 if @srt_column is not null
		 begin
			set @table_select = 'select * from dbo.['+@tablename+'] where '+stuff(@srt_column, 1, 4, '');
			--raiserror(@table_select, 0, 0) with nowait;
			exec ('if EXISTS ('+@table_select+') raiserror('''+@tablename+''', 0, 0) with nowait;');
		end;
END;
CLOSE CurTableName;
DEALLOCATE CurTableName;
20 сен 12, 16:27    [13197362]     Ответить | Цитировать Сообщить модератору
 Re: поиск в SQL  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Minamoto
Для вашей задачи можно в курсоре перебрать все колонки всех таблиц и сделать селект.

Делали такое для uniqueidentifier, можно переделать для остальных типов колонок:

Сам себя поправлю - в скрипте сделано неявное и опасное допущение, что все объекты хранятся в схеме dbo. Для нашего частного случая это так и есть, но для общего случая нужно поправить скрипт.
20 сен 12, 16:34    [13197387]     Ответить | Цитировать Сообщить модератору
 Re: поиск в SQL  [new]
Лори
Member

Откуда:
Сообщений: 1256
aatm
где-то в базе SQL есть значение в какой таблице неизвестно
как найти? есть какой-то общий поиск?
чтобы завести значение а SQL сам все свои таблицы пересмотрел?

Если поле известно (например, _IDRRef), то можно сделать так:
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t

SELECT  TABLE_NAME
INTO #t
FROM INFORMATION_SCHEMA.TABLES

ALTER TABLE #t ADD k1 INT IDENTITY

DECLARE @i INT
DECLARE @str VARCHAR(200)
SET @i=0
SET @str=''

WHILE @i<(SELECT MAX(k1) FROM #t)
      BEGIN
          SET @i=@i+1
                     
          SELECT @str=TABLE_NAME
          FROM #t
          WHERE k1=@i
           
          BEGIN Try
           
          EXEC('
                SELECT  *, '+@i+'
                FROM '+@str+'
                WHERE CAST(_IDRRef AS UNIQUEIDENTIFIER)=''0C00EC9A-1C29-5355-11E0-9013C0162F56''
              ')
          END TRY 
          
          BEGIN CATCH
          END CATCh
      END

 ---А потом найти в выгруженном списке непустую строку с номером (например, если номер=307), то
/*
select *
from #t
where k1=307
*/
20 сен 12, 16:51    [13197490]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить