Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Запросы   Найти похожие ветки 

 
Koba   (2004-04-15 21:21) [0]

Пожскажите как узнать результат запроса(присвоить его переменной):
select count(*) from XXX


 
kaif ©   (2004-04-15 21:26) [1]

Зависит от того, как делается сам запрос. Если с помощью компонентов типа TQuery, то нужно запрос открыть (метод Open),  а затем считать значение поля методом
Query1.Fields[0].AsInteger.
А можно сделать псевдоним для поля в запросе:
select count(*) ccc from XXX
И обратиться по имени:
Query1.FieldByName("ccc").AsInteger


 
tERRORist ©   (2004-04-15 21:26) [2]

declare @len int
set @len=(select count(*) from xxx)

а вот меня интересует как найти максимальную длину значения (если значение представить как строку) в поле, когда название самого поля и таблицы заранее не известно.


 
kaif ©   (2004-04-15 21:29) [3]

2 tERRORist ©   (15.04.04 21:26) [2]
Это код для MSSQL ?
Тогда, ИМХО, ответом на твой вопрос будет запрос этих данных из системных таблиц MSSQL. Где описываются метаданные таблиц?


 
tERRORist ©   (2004-04-15 21:33) [4]

НЕ не совсем меня правильно понял. Максимально допустимую длину (т.е. которую задаешь при проектировании таблицы можно легко вытащить из метаданных), а мне нужно узнать какова реальная максимальная длина поля (длину самого длинного значения :).
Причем еще косяк в том, что название столбца и таблицы заранее не известно, а получаются из текстовых параметров...


 
kaif ©   (2004-04-15 21:39) [5]

А что максимально задаваемая не равна реально максимальной?
Например, мне всегда казалось, что VARCHAR(50) это поле, в которое реально можно запихать строку, длиной именно максимум в  50 символов. Или это в MSSQL не так?


 
tERRORist ©   (2004-04-15 21:41) [6]

Если названия столбца и таблицы знать заранее, то найти легко:

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:42) [7]

Может тебе нужно
select max(length(<поле>)) from <таблица>
?
Тогда нужно откопать функцию length в MSSQL. Там много функций. Такая явно тоже найдется. И не одна.


 
kaif ©   (2004-04-15 21:47) [8]

Я понял наконец. А в конце-то концов что нужно получить на стороне клиента? Одно значение для данного поля данной таблицы? Или целый массив таких значений?


 
kaif ©   (2004-04-15 21:48) [9]

Из хранимых процедур же можно обращаться к временным таблицам. Напиши хранимую процедуру.


 
tERRORist ©   (2004-04-15 21:51) [10]

Нужно что-то вроде этого:

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:56) [11]

Объяви курсор и в нем сделай это присвоение.


 
tERRORist ©   (2004-04-15 21:56) [12]

Ну наверно придется действительно пихать все это в процедуру,
просто хотел ее разгрузить, вынести определение длины в функцию.
А нужно это все для универсального отчета. Вобщем штука такая, в процедуру передаются название таблицы и список группируемых столбцов, а она выдает тебе результат в красивом виде и так для любой таблицы.


 
kaif ©   (2004-04-15 22:02) [13]

Да, я понял, что ты хочешь сделать. Только я вот чего не понял. Почему внутри функции ты можешь задействовать запрос SELECT, но не можешь у него "похитить" результат? Ты пробовал объявлять курсор? Курсор по динамическом SQL сработает? Он же всего один раз должен будет "щелкнуть" - присвоить результат переменной, которую вернет функция.


 
tERRORist ©   (2004-04-15 22:08) [14]

Че-то я вопрса не понял...
Селект-то я могу сделать, но ведь заранее не известно на что -
имена столбца и таблицы переменные. А вытащить данные из exec(@command) никак не получится, сервер ведь открывает отдельною соединение, и там выполнияет код который идет в параметре @command


 
Hro   (2004-04-15 22:20) [15]

>> tERRORist
Стоп, только без курсоров пожалуйста, они медленно работают.
Меня kaif попросил помоч.
сформулируй пожалуйста еще раз свою задачу


 
Hro   (2004-04-15 22:23) [16]

>> tERRORist
для одного поля
select maxlen=max(L) from (select L=len(field1) from table1) as tt


 
tERRORist ©   (2004-04-15 22:34) [17]

>Стоп, только без курсоров пожалуйста, они медленно работают.
Курсоры работают нормально, я на них как раз все и строю, чтоб получать группировки.

>Меня kaif попросил помоч.
>сформулируй пожалуйста еще раз свою задачу

Задача офигенная, надо сделать универсальный отчет, чтоб в процедуру передавались имя таблицы и список группируемых столбцов, а она выдавала результат в красивом сгруппированном виде. Вобщем уже все сделал реально, на клиенте в DBGridEh все выводится, раскрашивается по уровням группировки, сделал даже свертывание, развертывание уровней на ЦеллКлик, суммирование - т.е как Пивот Тэйбл в Екселе. Осталось немного подправить такую штуку. Если хочется сгруппировать на одном уровне несколько столбцов, то у меня формируется строка (которая вставляется в результат как заголовок уровня) "Название столбца1: Сгруппированное значние1 "+ "Название столбца2: Сгруппированное значение2". Но значения <Сгруппированное значение> могут иметь разную длину, т.е. в другом заголовке того же уровня они не будут строго друг под другом, вот я и хотел находить максимальную длину и по ней форматировать. Вобщем это наверно сложно для понимания, если б посмотреть скриншот сразу станет ясно... Жаль картинки нельзя вставлять


 
kaif ©   (2004-04-16 01:55) [18]

Может залезть в дебри DBGridEh, я так понял, что вся информация уже на клиенте?



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.031 c
3-1079435244
genemy
2004-03-16 14:07
2004.04.11
cross-tab


14-1082074235
Мазут Береговой
2004-04-16 04:10
2004.04.11
По поводу съёмки полнометражных фильмов....


14-1082452488
Феликс
2004-04-20 13:14
2004.04.11
Импорт файла 1С


7-1076327133
ma
2004-02-09 14:45
2004.04.11
Как переделать мне зто для работы в window 2000


1-1082617439
sergeii
2004-04-22 11:03
2004.04.11
Funkcija konvertirujushiaja Cifri v slova