![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запросы
Koba © (2004-04-15 21:21:00)Пожскажите как узнать результат запроса(присвоить его переменной):
select count(*) from XXX
kaif (2004-04-16 01:55:00) [1]Может залезть в дебри DBGridEh, я так понял, что вся информация уже на клиенте?
tERRORist (2004-04-15 22:34:00) [2]>Стоп, только без курсоров пожалуйста, они медленно работают.
Курсоры работают нормально, я на них как раз все и строю, чтоб получать группировки.
>Меня kaif попросил помоч.
>сформулируй пожалуйста еще раз свою задачу
Задача офигенная, надо сделать универсальный отчет, чтоб в процедуру передавались имя таблицы и список группируемых столбцов, а она выдавала результат в красивом сгруппированном виде. Вобщем уже все сделал реально, на клиенте в DBGridEh все выводится, раскрашивается по уровням группировки, сделал даже свертывание, развертывание уровней на ЦеллКлик, суммирование - т.е как Пивот Тэйбл в Екселе. Осталось немного подправить такую штуку. Если хочется сгруппировать на одном уровне несколько столбцов, то у меня формируется строка (которая вставляется в результат как заголовок уровня) 'Название столбца1: Сгруппированное значние1 '+ 'Название столбца2: Сгруппированное значение2'. Но значения <Сгруппированное значение> могут иметь разную длину, т.е. в другом заголовке того же уровня они не будут строго друг под другом, вот я и хотел находить максимальную длину и по ней форматировать. Вобщем это наверно сложно для понимания, если б посмотреть скриншот сразу станет ясно... Жаль картинки нельзя вставлять
Hro (2004-04-15 22:23:00) [3]>> tERRORist
для одного поля
select maxlen=max(L) from (select L=len(field1) from table1) as tt
Hro (2004-04-15 22:20:00) [4]>> tERRORist
Стоп, только без курсоров пожалуйста, они медленно работают.
Меня kaif попросил помоч.
сформулируй пожалуйста еще раз свою задачу
tERRORist (2004-04-15 22:08:00) [5]Че-то я вопрса не понял...
Селект-то я могу сделать, но ведь заранее не известно на что -
имена столбца и таблицы переменные. А вытащить данные из exec(@command) никак не получится, сервер ведь открывает отдельною соединение, и там выполнияет код который идет в параметре @command
kaif (2004-04-15 22:02:00) [6]Да, я понял, что ты хочешь сделать. Только я вот чего не понял. Почему внутри функции ты можешь задействовать запрос SELECT, но не можешь у него "похитить" результат? Ты пробовал объявлять курсор? Курсор по динамическом SQL сработает? Он же всего один раз должен будет "щелкнуть" - присвоить результат переменной, которую вернет функция.
tERRORist (2004-04-15 21:56:00) [7]Ну наверно придется действительно пихать все это в процедуру,
просто хотел ее разгрузить, вынести определение длины в функцию.
А нужно это все для универсального отчета. Вобщем штука такая, в процедуру передаются название таблицы и список группируемых столбцов, а она выдает тебе результат в красивом виде и так для любой таблицы.
kaif (2004-04-15 21:56:00) [8]Объяви курсор и в нем сделай это присвоение.
tERRORist (2004-04-15 21:51:00) [9]Нужно что-то вроде этого:
set @command=' if not exists( select * from tempdb..sysobjects where name='##temp_table') '+
' create table ##temp_table (column_length int);'
exec(@command)
set @command=' insert into ##temp_table (column_length)'+
' select max(len(cast('+@column+' as varchar(8000)))), ' from '+@table+';'
exec(@command)
set @len=(select column_length from ##temp_table)
где @table и @column -динамически подставляемые имена
kaif (2004-04-15 21:48:00) [10]Из хранимых процедур же можно обращаться к временным таблицам. Напиши хранимую процедуру.
kaif (2004-04-15 21:47:00) [11]Я понял наконец. А в конце-то концов что нужно получить на стороне клиента? Одно значение для данного поля данной таблицы? Или целый массив таких значений?
kaif (2004-04-15 21:42:00) [12]Может тебе нужно
select max(length(<поле>)) from <таблица>
?
Тогда нужно откопать функцию length в MSSQL. Там много функций. Такая явно тоже найдется. И не одна.
tERRORist (2004-04-15 21:41:00) [13]Если названия столбца и таблицы знать заранее, то найти легко:
set @len=(select max(len(cast(COLUMN1 as varchar(8000)))) from TABLE1)
Но дело в том что COLUMN1, TABLE1 нужно подставлять динамически.
Попробовал сделать функцию, в которой выполняю динамические запросы exec('<command>') и записываю результат во временную табличку, но при присвоении переменной @len=(select column_length from #temporary_table) сервер зараза ругается, говорит что нельзя обращаться из функций к временных таблицам :(
kaif (2004-04-15 21:39:00) [14]А что максимально задаваемая не равна реально максимальной?
Например, мне всегда казалось, что VARCHAR(50) это поле, в которое реально можно запихать строку, длиной именно максимум в 50 символов. Или это в MSSQL не так?
tERRORist (2004-04-15 21:33:00) [15]НЕ не совсем меня правильно понял. Максимально допустимую длину (т.е. которую задаешь при проектировании таблицы можно легко вытащить из метаданных), а мне нужно узнать какова реальная максимальная длина поля (длину самого длинного значения :).
Причем еще косяк в том, что название столбца и таблицы заранее не известно, а получаются из текстовых параметров...
kaif (2004-04-15 21:29:00) [16]2 tERRORist © (15.04.04 21:26) [2]
Это код для MSSQL ?
Тогда, ИМХО, ответом на твой вопрос будет запрос этих данных из системных таблиц MSSQL. Где описываются метаданные таблиц?
kaif (2004-04-15 21:26:00) [17]Зависит от того, как делается сам запрос. Если с помощью компонентов типа TQuery, то нужно запрос открыть (метод Open), а затем считать значение поля методом
Query1.Fields[0].AsInteger.
А можно сделать псевдоним для поля в запросе:
select count(*) cccfrom XXX
И обратиться по имени:
Query1.FieldByName('ccc').AsInteger
tERRORist (2004-04-15 21:26:00) [18]declare @len int
set @len=(select count(*) from xxx)
а вот меня интересует как найти максимальную длину значения (если значение представить как строку) в поле, когда название самого поля и таблицы заранее не известно.