Имя: Пароль:
1C
1С v8
Нужно найти слово в базе данных MS SQL 2012 , не зная в какой таблице искать
, ,
0 Аспирант
 
01.11.13
11:43
Доброго всем предпраздничного дня!
Больше конечно относится к SQL но кто сталкивался помогите с задачкой. Нужен скриптик, гугл не помогает
1 Wobland
 
01.11.13
11:44
это спортивный интерес? никак не сфантазирую практическое применение
2 Аспирант
 
01.11.13
11:45
вот нужно определить табличку где есть конкретные слова, реальная задачка
3 Аспирант
 
01.11.13
11:46
тупой перебор всех табличек вручную не предлагать )
4 Maxus43
 
01.11.13
11:46
к 1с относится или нет? просто в 1с сначала табоичку узнай, потом ищи
5 fisher
 
01.11.13
11:47
В смысле, во всех строковых полях всех таблиц БД?
Ну, можно теоретически. Системные таблицы + Transact SQL и динамические запросы. Готового скрипта, извини, нету. Рисовать лень и некогда :)
6 shuhard
 
01.11.13
11:47
(0)[Нужен скриптик, гугл не помогает]
под дурку косишь ?
7 Maxus43
 
01.11.13
11:48
>>не зная в какой таблице искать
>>тупой перебор всех табличек вручную не предлагать

тут явное логическое противоречие, перебирать все таблицы и их поля придётся по любому
8 Аспирант
 
01.11.13
11:48
нет пока не связано, нужно из сторонней базы sql собирать данные, но не зная в какой таблице искать - трудно это реализовать
9 Аспирант
 
01.11.13
11:48
(7) согласен но не ручками
10 fisher
 
01.11.13
11:49
(7) Нет противоречия. Ключевое слово - "вручную"
11 Аспирант
 
01.11.13
11:49
(6) найди хоть одну толковую и рабочую ссылку
буду очень благодарен
12 GANR
 
01.11.13
11:50
13 fisher
 
01.11.13
11:51
(12) А где же скриптик? :)
14 GANR
 
01.11.13
11:51
(13) писать лень
15 Аспирант
 
01.11.13
11:52
(12) что это дает? допускаю что в скрытых табличках искать надо, но как
16 Аспирант
 
01.11.13
11:53
http://habrahabr.ru/qa/16495/
нашел это но похоже не прокатит в 2012
17 GANR
 
01.11.13
11:58
(16) Короче, надо как угодно достать таблицы БД и ее колонки с типами и по строковым колонкам ставить фильтры и делать запрос к каждой таблице. Хранимую процедуру, наверное, надо написать.
18 GANR
 
01.11.13
12:01
(0) А вообще такие вопросы лучше не на мисте спрашивать, а у аскакал этого сайта http://sql-ex.ru/.
19 Аспирант
 
01.11.13
12:01
(17) это все понятно в теории
20 Аспирант
 
01.11.13
12:02
(18) попробую у них спросить, решение выложу обязательно
21 fisher
 
01.11.13
12:15
(18) Не в кассу. Там более общие задачи решаются.
Лучше на sql.ru
22 МихаилМ
 
01.11.13
12:17
для версии скл выше 2000 ищите по слову sys.syscolumns
23 МихаилМ
 
01.11.13
12:18
+(22)

+ sp_foreachtable()
24 Аспирант
 
01.11.13
12:41
set concat_null_yields_null on

declare

@collist varchar(max),

@srch_sql varchar(max),

@schemaName varchar(128),
@tableName varchar(128)
declare curs cursor local static forward_only for
select distinct c.TABLE_SCHEMA, c.TABLE_NAME
from INFORMATION_SCHEMA.[COLUMNS] c
where c.DATA_TYPE in('char', 'varchar', 'nvarchar', 'text')
and c.CHARACTER_MAXIMUM_LENGTH >=4
and objectproperty(object_id(c.TABLE_SCHEMA + '.'+ c.TABLE_NAME), 'IsUserTable ') = 1
order by 1, 2
open curs
while 1=1
begin

fetch next from curs into @schemaName, @tableName
if @@FETCH_STATUS <> 0 break

-- Данную строку можно раскомментарить, если хочется видеть, в какой таблице идет поиск в данный момент
  raiserror(';%s.%s', 10, 1, @schemaName, @tableName) with nowait

select
@collist = null

select
@collist = isnull(@collist + '
or ', '') +'upper(convert(varchar(8000), ' + c.COLUMN_NAME + ')) like ''%Вася%''' -- Тут указываем, что и как ищем
from INFORMATION_SCHEMA.[COLUMNS] c
where c.TABLE_SCHEMA = @schemaName
and c.TABLE_NAME = @tableName
and c.DATA_TYPE in('char', 'varchar', 'nvarchar', 'text')
and c.CHARACTER_MAXIMUM_LENGTH >=6
set @srch_sql = 'if exists(select * from '+@schemaName+'.'+@tableName+' with(nolock) where '+@collist+')
raiserror('''+@schemaName+'.'+@tableName+' - found!'', 10, 1) with nowait'

exec(@srch_sql)
end
25 Аспирант
 
01.11.13
12:42
как и обещал выложил, проверено рабочий!!!
%Вася%'  то что ищем!
Всем спасибо приятных выходных!!!
26 Аспирант
 
01.11.13
12:43
спасибо первоисточнику http://www.gotdotnet.ru/blogs/DeColores/7014/
27 Kreont
 
01.11.13
12:45
(0) Если база небольшая, можно тупо выгрузить бекап в sql-код (MySQL такое точно умеет), а там хоть Far-ом дальше.
28 Аспирант
 
01.11.13
12:46
(27) тоже вариант, только сумеешь определить табличку?
29 Kreont
 
01.11.13
12:47
(28) ну да, там ж будет код типа
create table aaa
insert|update 'слово поиска' ...
30 Kreont
 
01.11.13
12:50
(28) так кстати норм выгружать, если надо перенести данные между разными БД (MySQL->Postgres->MSsql->Oracle), после небольших правок файлов бекапа иногда