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

Откуда:
Сообщений: 92
Подскажите пожалуйта идею.
Есть некая база данных из которой я должен получить max() для всех столбцов из всех таблиц.
я использую курсор


DECLARE CustCursor CURSOR
FOR
select tbl.name as tabl, col.name as colum
from sys.tables as tbl
join sys.columns as col on tbl.object_id = col.object_id

open CustCursor
FETCH NEXT FROM CustCursor
while @@FETCH_STATUS=0
begin
FETCH NEXT FROM CustCursor
end
close CustCursor
DEALLOCATE CustCursor

но естественно на выходе получаю список из select statement (таблицы и столбцы) Куда мне нужно включить запрос для получения max
18 янв 12, 13:43    [11924963]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
https://www.sql.ru/faq/faq_topic.aspx?fid=104
18 янв 12, 13:48    [11925019]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
kornilov,

На основе списка столбцов и таблиц, сформируйте динамический sql, в который подставьте соответсвующие таблицы и столбцы, далее выполните этот скрипт.
п.с. можно обойтись и без курсора, но думаю вам это не принципиально.
18 янв 12, 13:50    [11925041]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
kornilov
Member

Откуда:
Сообщений: 92
SomewhereSomehow,

declare @col varchar(100) = 'col.name', @tbl varchar(100) = 'table.name'
exec ('select max(['+@col+']) from ims.['+@tbl+']')

вот такой запрос, но мне в ручную придётся вбивать все строки и столбцы???
18 янв 12, 14:07    [11925201]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
kornilov
Member

Откуда:
Сообщений: 92
ответьте пожалуйста
18 янв 12, 14:26    [11925415]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
kornilov
вот такой запрос, но мне в ручную придётся вбивать все строки и столбцы???

Почему вручную то, если вы сами же написали уже цикл с курсором ?
18 янв 12, 14:44    [11925603]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
IUnIKnown
Member

Откуда:
Сообщений: 9
kornilov,

DECLARE @tmptab as table (id int IDENTITY
                                 ,[TableName] varchar(max)
                                 ,[ColumnName varchar(max)])
DECLARE @rez as table ( [TableName] varchar(max)
                                 ,[ColumnName varchar(max)]
                                 , [max] int)
DECLARE @tab varchar(max)
DECLARE @col varchar(max)
DECLARE @i int
DECLARE @End int

--Заливаем в эту таблицу все имена таблиц и колонки необходимые для вычисления
INSERT @tmptab 
SELECT (schema_name(t.schema_id)+'.['+t.name+']') as TableName
           ,('['+c.name+']') as ColumnName 
FROM        sys.columns c 
INNER JOIN sys.tables   t
           ON c.object_id=t.object_id

--А потом циклом по id вытаскиваем таблицу и колонку и вставляем в динамический запрос
SET @i=1
SET@end=(SELECT COUNT(*)From @tmptab)
WHILE @i<@end
BEGIN
SET @tab=(SELECT TableName FROM @tmptab WHERE id=@i )
SET @col=(SELECT ColumnName FROM @tmptab WHERE id=@i )

INSERT @rez exec ('select max(['+@col+']) from ['+@tab+']')
SET @i=@i+1
END

SELECT * FROM @rez


P.S Написал на скорую руку, в SMS не проверял, если есть ошибки извиняюсь заранее, но идея у меня такова)))
18 янв 12, 14:45    [11925609]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
kornilov
Member

Откуда:
Сообщений: 92
IUnIKnown,

спасибо большое
18 янв 12, 14:49    [11925659]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
kornilov
Member

Откуда:
Сообщений: 92
помогите разобраться

use ims
declare @tab varchar(max)
declare @col varchar(max)
declare @rez as table ([rezult] varchar(max))
DECLARE Cur CURSOR
FOR
select tbl.name as tabl, col.name as colum
from sys.tables as tbl
join sys.columns as col on tbl.object_id = col.object_id
open Cur
FETCH next FROM Cur
into @tab,@col
while @@FETCH_STATUS=0
begin
insert @rez
exec ('select max(['+@col+']) from ims.['+@tab+']')
fetch next from Cur
select * from @rez
end
close Cur


выводит список таблиц и столбцов но не выводит max значение где ошибка? И очень долго выполняется запрос, намного дольше чем без курсора, хотя как я понимаю должно быт ь наоборот
19 янв 12, 14:15    [11932731]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
kornilov
Member

Откуда:
Сообщений: 92
точнее выводит результат для всех такой же как для 1ой пары таблица-столбец
19 янв 12, 14:38    [11932990]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить