:: Не фоксом единым
Re: MSSQL - есть ли такая конструкция
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
ssa
Для получения списка всех текстовых полей всех таблиц совершенно не нужны курсоры, перебирания таблиц и прочая ерундистика.
А для поиска произвольного текста "во всех текстовых полях всех таблиц"
ssa
Конкатенацию строк для получения текста запроса лучше делают клиенты. На сервере такой вот универсальный код получения количества строк с каким-то значением поля менее эффективен.
Ну писать специальную программу для вышеозначенных целей это IMHO перебор будет А в качестве "отладочного/интерактивного" кода (не для целей встраивания в программу) почему бы и нет?
Как раз для таких целей (изучение БД как "чёрного ящика") вполне применимы такого рода скрипты.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: MSSQL - есть ли такая конструкция
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Igor Korolyov
ssa
Для получения списка всех текстовых полей всех таблиц совершенно не нужны курсоры, перебирания таблиц и прочая ерундистика.
А для поиска произвольного текста "во всех текстовых полях всех таблиц"
И для этого тоже.
Цитата:
ssa
Конкатенацию строк для получения текста запроса лучше делают клиенты. На сервере такой вот универсальный код получения количества строк с каким-то значением поля менее эффективен.
Ну писать специальную программу для вышеозначенных целей это IMHO перебор будет А в качестве "отладочного/интерактивного" кода (не для целей встраивания в программу) почему бы и нет?
Как раз для таких целей (изучение БД как "чёрного ящика") вполне применимы такого рода скрипты.
Лучше научиться правильно разделять код между клиентом и сервером.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: MSSQL - есть ли такая конструкция
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
ssa
Конкатенацию строк для получения текста запроса лучше делают клиенты.
Что такое "Клиенты" в данном контексте? Можно пример какого либо "Клиента"?
Microsoft SQL Server Managment Studio является таким клиентом?

ssa
На сервере такой вот универсальный код получения количества строк с каким-то значением поля менее эффективен.
А какой тогда код эффективен? Можно ссылку?

ssa
Все вместе выливается в напрасную трату времени и средств.
Имеется ввиду "машинное время" (время работы компьютера)?



Исправлено 1 раз(а). Последнее : S-type, 05.07.16 17:29
Ratings: 0 negative/0 positive
Re: MSSQL - есть ли такая конструкция
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
Как раз для таких целей (изучение БД как "чёрного ящика") вполне применимы такого рода скрипты.
Да, именно так - цель была (и есть), изучить БД программы, что бы перелить туда данные, а в дальнейшем (возможно) обеспечить синхронизацию с другими программами.

ssa
Лучше научиться правильно разделять код между клиентом и сервером.
Ни как не могу понять, о чём Вы. Мне не надо писать приложение "с нуля" или переписывать уже готовое. Программа есть, она работает (по крайней мере, другие ей пользуются). Скрипт нужен только для изучения БД.
Ratings: 0 negative/0 positive
Re: MSSQL - есть ли такая конструкция
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Вот, кстати, итоговый скрипт.

begin
declare @Column sysname
declare @Table sysname
declare @sql_stmt nvarchar(200)
declare @count_rec int
declare txtColumn cursor for
select c.name column_name,
o.name table_name
from syscolumns c
inner join sysobjects o
on o.id = c.id
where c.xtype=231
and o.xType='U'
open txtColumn
while (1=1)
begin
fetch next
from txtColumn
into @Column,@Table
if @@fetch_status!=0 break
set @sql_stmt = 'SELECT @count_rec=count(*) FROM '+@Table+' WHERE ['+@Column+']=@par1'
exec sp_executesql @sql_stmt, N'@par1 nvarchar(200), @count_rec int OUTPUT', @par1=N'Департамент информационных технологий (ДИТ)', @count_rec=@count_rec OUTPUT
if @count_rec>0 begin
PRINT 'Таблица '+@Table+' столбец '+@Column
end
end
close txtColumn
deallocate txtColumn
end

Буду признателен, если кто то покритикует код.
Ratings: 0 negative/0 positive
Re: MSSQL - есть ли такая конструкция
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
1. Велосипед уже изобретен. И даже не очень сильно отличается от твоего творения. Тут
2. В обоих вариантах получение списка всех нужных полей из всех таблиц можно выполнить одним запросом к information_schema.columns и даже без джойнов.
3. В обоих случаях может оказаться значительно эффективней не выполнять сразу же сгенеренную строку команды, а накопить их все в один пакет и уже его в конце отправить на выполнение.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/1 positive
Re: MSSQL - есть ли такая конструкция
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
А еще эффективней будет сгенерить этот пакет один раз и параметризовать его. При этом при генерации не нужен будет курсор, sqlexec и т.д.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: MSSQL - есть ли такая конструкция
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну так по сути тот же код - только там он НЕ параметризован (тут параметризован на уровне динамически выполняемой команды) плюс пользует временную таблицу. Да, там он решает чуть другую задачу - поиск ВСЕХ подходящих записей (точнее полей - но это не суть важно), а тут более примитивную - поиск таблиц где есть подходящие записи
Про эффективность такого рода кода я бы особо париться не стал - это не критичный по времени запрос. Хотя, справедливости ради, в том же оракле иногда я делаю именно простой запрос генерирующий "простыню" кода (используя spool можно это сразу запихать в новый sql файл), а потом банально этот сгенерированный код и запускаю


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: MSSQL - есть ли такая конструкция
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
ssa
1. Велосипед уже изобретен. И даже не очень сильно отличается от твоего творения. Тут

Хм... При всём моём уважении к Вам, Всё равно Вашу мысль не пойму. Ладно бы ссылка была на foxclub.ru, а то на какой то внешний сайт. К тому же, хочется научиться программы писать, а не получить навык "хорошо умею гуглить".

ssa
2. В обоих вариантах получение списка всех нужных полей из всех таблиц можно выполнить одним запросом к information_schema.columns и даже без джойнов.
Join это зло, которого надо избегать? Глубоко сомневаюсь. Или, information_schema.columns даёт какой то иной результат, чем поиск с помощью syscolumns и sysobjects? Или, syscolumns и sysobjects устарели и не рекомендуются MS к использованию? В чём соль?

ssa
3. В обоих случаях может оказаться значительно эффективней не выполнять сразу же сгенеренную строку команды, а накопить их все в один пакет и уже его в конце отправить на выполнение.
Для решения задачи "запрыгнуть в движущийся поезд" не надо вычислять идеальную траекторию своего движения (т.е. не надо сидеть на перроне вычисляя скорость поезда, вес чемоданов, длину перрона и расположение на перроне столбов и ларьков). Надо быстро схватить чемодан и как можно быстрее бежать к поезду. Что бы найти, в какой таблице хранится то или иное значение, не обязательно перерывать весь интернет, не нужно писать идеальный запрос (оптимальный с любой точки зрения). Достаточно "на коленке" набросать скрипт и выполнить его пару-тройку раз. И, в следующий раз придётся вернуться к этому скрипту через год, а может и через три. К тому моменту возможно это будет уже другая СУБД и другой язык, но общий алгоритм будет тот же.
Не нужно мне "пакет"



Исправлено 1 раз(а). Последнее : S-type, 06.07.16 08:59
Ratings: 0 negative/0 positive
Re: MSSQL - есть ли такая конструкция
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Интересно)))
Конечно никто не знает, что конкретно тебе надо.
Но, если это на 1 раз, то какая разница какой код.
Если ты пытаешься анализировать базу, по ее содержимому, то возможно, тебе по многим словам придется искать.
И совет, сгенерировать, пусть и огромный скрипт, с параметром, а потом забыть о его содержимом, а просто запускать... кажется очень разумным, и вызывает недоумение возмущения))))


------------------
Ratings: 0 negative/0 positive
Re: MSSQL - есть ли такая конструкция
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Пошли отмазы капризного ребенка во время истерики... Всего хорошего.


------------------
Лень - это неосознанная мудрость.
Ratings: 2 negative/1 positive
Re: MSSQL - есть ли такая конструкция
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
Вообще исследование содержимого базы и методы взлома - наверное не для этого форума


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/0 positive
Re: MSSQL - есть ли такая конструкция
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
S-type
К тому же, хочется научиться программы писать, а не получить навык "хорошо умею гуглить".
Ну так в результате поисков и находятся "хорошие решения" которые ты потом будешь применять в своей работе Правда, отделить зёрна от плевел ой как непросто...
S-type
Join это зло, которого надо избегать? Глубоко сомневаюсь. Или, information_schema.columns даёт какой то иной результат, чем поиск с помощью syscolumns и sysobjects? Или, syscolumns и sysobjects устарели и не рекомендуются MS к использованию? В чём соль?
Внутри системных представлений в любом случае будут использоваться join-ы - и даже много больше чем хотелось бы. Но лазить из-за этого напрямую к системным таблицам не есть хорошо (в том же оракле у обычного пользователя и прав то нет чтобы напрямую к системным таблицам обращаться - только через представления и то не все будут доступны...
Между представлением information_schema.columns и другими системными представлениями реально есть разница. Например в том какие "поля" отбрасываются (сам ведь в where дописал подобные условия), какие дополнительно системные таблицы прицепляются (порой это полезно, а порой не нужно и лишь мешает замедляя запрос)... Конкретно syscolumns является устаревшим объектом (и уже даже не системной таблицей, а тоже системным представлением) sys.columns является рекомендованной заменой - но, опять же, и представления из information_schema вполне себе "рекомендуются лучшими собаководами"
S-type
Для решения задачи "запрыгнуть в движущийся поезд" не надо...
Иногда "лучше день потерять, а потом за 5 минут долететь"
Одно дело 3 раза запускать подобный "поисковик", и другое 100 раз это же делать - при том над многогигабайтной БД. Одно дело статичная БД (где структуры не меняются сами собой) и другое - "ужас одмина", где на лету создаются и удаляются тыщи таблиц/полей
Так что в совете сделать из этой функции не "исполнитель динамических запросов" а лишь генератор скрипта для последующего его [скрипта] многократного исполнения есть практический смысл...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: MSSQL - есть ли такая конструкция
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
ssa
Пошли отмазы капризного ребенка во время истерики... Всего хорошего.
Как то неадекватно...

Искренне пытался понять - что Вы хотели мне сказать - видимо, не дорос. К тому же, постоянно задавал конкретные вопросы... которые Вы успешно игнорировали.
Ratings: 1 negative/0 positive
Re: MSSQL - есть ли такая конструкция
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
S-type
К тому же, хочется научиться программы писать, а не получить навык "хорошо умею гуглить".
Ну так в результате поисков и находятся "хорошие решения" которые ты потом будешь применять в своей работе Правда, отделить зёрна от плевел ой как непросто...
Золотые слова, Юрий Бенедиктович (C) Наша Раша.

Igor Korolyov
Конкретно syscolumns является устаревшим объектом (и уже даже не системной таблицей, а тоже системным представлением) sys.columns является рекомендованной заменой - но, опять же, и представления из information_schema вполне себе "рекомендуются лучшими собаководами"
Понял, подправлю запрос.

Igor Korolyov
S-type
Для решения задачи "запрыгнуть в движущийся поезд" не надо...
Иногда "лучше день потерять, а потом за 5 минут долететь"
Очень даже помню, чем этот мультфильм закончился

Igor Korolyov
Одно дело 3 раза запускать подобный "поисковик", и другое 100 раз это же делать - при том над многогигабайтной БД. Одно дело статичная БД (где структуры не меняются сами собой) и другое - "ужас одмина", где на лету создаются и удаляются тыщи таблиц/полей
Так что в совете сделать из этой функции не "исполнитель динамических запросов" а лишь генератор скрипта для последующего его [скрипта] многократного исполнения есть практический смысл...
Безусловно, смысл есть. Так же, есть смысл и в том, что "решение должно быть адекватно поставленной задаче". В данном задача одноразовая, база маленькая (пока).
Ratings: 0 negative/0 positive
Re: MSSQL - есть ли такая конструкция
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Предлагаю считать вопрос закрытым.

Коллеги, всем спасибо за оперативную помощь.

Отдельное спасибо PaulWist и Igor Korolyov.



Исправлено 1 раз(а). Последнее : S-type, 06.07.16 16:09
Ratings: 0 negative/0 positive
Re: MSSQL - есть ли такая конструкция
Гулин Федор

Сообщений: 4640
Откуда: Минск
Дата регистрации: 24.10.2002
зы про information_schema.columns
золотые слова

зы а еще можно включить скл-профайлер - настроить и глянуть какие запросы идут из апликейшена - черного ящика
Ratings: 0 negative/1 positive
Re: MSSQL - есть ли такая конструкция
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
В качестве инфы для размышлений скрипт подсчета количества строк во всех таблицах:
declare @str varchar(max);
create table #t (T_Name sysname, cnt int);
select
@str = replace(
(
select 'insert into #t select '''+TABLE_NAME+''',count(*) from '+TABLE_NAME+char(160) as 'data()'
from INFORMATION_SCHEMA.TABLES where Left(TABLE_NAME, 4) = 'SPR_' and TABLE_TYPE = 'BASE TABLE'
for xml path('')
)
, char(160), ';')
exec (@str)
select * from #t
drop table #t
Здесь путём правильной доработки напильником в виде замены моих условий выбора таблиц на свои, настройки запроса для каждой таблицы и донастройки запроса из временной таблицы можно получить хоть слона.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: MSSQL - есть ли такая конструкция
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Если заменить

select c.name column_name,
o.name table_name
from syscolumns c
inner join sysobjects o
on o.id = c.id
where c.xtype=231
and o.xType='U'

на

select column_name,
table_name
from information_schema.columns
where data_type='nvarchar'

то выводятся не только таблицы, но и вьюшки (представления). Что бы их отсечь приходится делать:

select c.column_name,
t.table_name
from information_schema.columns c
inner join information_schema.TABLES t
on c.TABLE_NAME=t.TABLE_NAME
where data_type='nvarchar'
and t.table_type='BASE TABLE'

Без Join-а ни куда
Ratings: 0 negative/0 positive
Re: MSSQL - есть ли такая конструкция
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Итого получился скрипт:

begin
declare @Column sysname
declare @Table sysname
declare @sql_stmt nvarchar(200)
declare @count_rec int
declare txtColumn cursor for
select c.column_name,
c.table_name
from information_schema.columns c
inner join information_schema.TABLES t
on c.TABLE_NAME=t.TABLE_NAME
and t.table_type='BASE TABLE'
where c.data_type='nvarchar'
open txtColumn
while (1=1)
begin
fetch next
from txtColumn
into @Column,@Table
if @@fetch_status!=0 break
set @sql_stmt = 'SELECT @count_rec=count(*) FROM '+@Table+' WHERE ['+@Column+']=@par1'
exec sp_executesql @sql_stmt, N'@par1 nvarchar(200), @count_rec int OUTPUT', @par1=N'Департамент информационных технологий (ДИТ)', @count_rec=@count_rec OUTPUT
if @count_rec>0 begin
PRINT 'Таблица '+@Table+' столбец '+@Column
end
end
close txtColumn
deallocate txtColumn
end
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 3 (Гостей: 3)

© 2000-2024 Fox Club 
Яндекс.Метрика