Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Северянин Member Откуда: Сообщений: 90 |
DECLARE @cols VARCHAR(1000) DECLARE @sqlquery VARCHAR(2000) SELECT @cols = STUFF(( SELECT distinct ',' + QuoteName([name_disc]) FROM disciplines FOR XML PATH('') ), 1, 1, '') SET @sqlquery = 'SELECT * FROM (SELECT (s.family+char(1)+s.name+parentname) as fio, rating, name_disc FROM ratings as Uo inner join students as S on uo.student=s.idstudent inner join disciplines as D on d.iddiscipline=uo.discipline) base PIVOT (SUM(rating) FOR [name_disc] IN (' + @cols + ')) AS finalpivot' EXECUTE ( @sqlquery ) Как вывести результат в локальную временную таблицу? Как в глобальную я знаю, а вот при попытке вывода в локальную, она (таблица) перестает быть видимой. |
8 окт 14, 11:49 [16675304] Ответить | Цитировать Сообщить модератору |
LexusR Member Откуда: Novosibirsk Сообщений: 1887 |
if OBJECT_ID('tempdb..#data') is not null drop table #data create table #data(id int,name varchar(10),val int) insert into #data values(1,'name1',10),(1,'name2',20),(1,'name3',30),(2,'name1',100),(2,'name2',200),(2,'name3',300) select * from #data DECLARE @cols VARCHAR(1000) DECLARE @sqlquery VARCHAR(2000) SELECT @cols = STUFF(( SELECT distinct ',' + QuoteName([name]) FROM #data FOR XML PATH('') ), 1, 1, '') if OBJECT_ID('tempdb..#result') is not null drop table #result create table #result(id int) set @sqlquery = 'alter table #result add ' +REPLACE(@cols,',',' int,')+ ' int' exec(@sqlquery) SET @sqlquery = 'SELECT id,'+@cols+' FROM #data PIVOT (SUM([val]) FOR [name] IN (' + @cols + ')) AS finalpivot' INSERT INTO #result EXECUTE ( @sqlquery ) select * from #result |
8 окт 14, 12:12 [16675507] Ответить | Цитировать Сообщить модератору |
Северянин Member Откуда: Сообщений: 90 |
LexusR, Не, совсем не то выдает. Дело в том, что если я вместо SET @sqlquery = 'SELECT * FROM (SELECT (s.family+char(1)+s.name+parentname) as fio, rating, name_disc FROM ratings as Uo inner join students as S on uo.student=s.idstudent inner join disciplines as D on d.iddiscipline=uo.discipline) base PIVOT (SUM(rating) FOR [name_disc] IN (' + @cols + ')) AS finalpivot' Задаю SET @sqlquery = 'SELECT * into ##глобальная_временная_таблица FROM (SELECT (s.family+char(1)+s.name+parentname) as fio, rating, name_disc FROM ratings as Uo inner join students as S on uo.student=s.idstudent inner join disciplines as D on d.iddiscipline=uo.discipline) base PIVOT (SUM(rating) FOR [name_disc] IN (' + @cols + ')) AS finalpivot' то результат сбрасывается в эту таблицу (##) А как можно(ли) в локальную? Как в обход, да на костылях я соображу, а вот грамотно чтоб? |
8 окт 14, 14:09 [16676452] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
А грамотно - это читать документацию, где ясно сказано, что локальная временная таблица автоматически удаляется по окончании создавшего ее пакета. |
||
8 окт 14, 14:12 [16676479] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
Северянин, много букв сбивает с толку? свою таблицу #result создавайте ЗАРАНЕЕ. никакого select into, только insert into в уже имеющуюся |
8 окт 14, 14:14 [16676491] Ответить | Цитировать Сообщить модератору |
Северянин Member Откуда: Сообщений: 90 |
o-o, Если бы я мог создать ее заранее, мне тогда эти изощрения совершенно ни к чему. Я не знаю, сколько полей с какими названиями будет, почему PIVOT и использую. |
8 окт 14, 14:28 [16676605] Ответить | Цитировать Сообщить модератору |
Северянин Member Откуда: Сообщений: 90 |
Glory, Нет так нет, хоть успокоюсь, а то вдруг решение простое есть, а я и не знаю. |
8 окт 14, 14:29 [16676613] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Ну так разве вам не показали, как создать ее заранее ?
Зачем вам вообще временная таблица понадобилась? |
||||
8 окт 14, 14:29 [16676615] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
а что по-вашему LexusR-то делает??? а вы все свое гнете... |
||
8 окт 14, 14:36 [16676644] Ответить | Цитировать Сообщить модератору |
Северянин Member Откуда: Сообщений: 90 |
Прошу прощения, но я Вас не понял. |
||||
8 окт 14, 14:40 [16676683] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
В реляционных базах данных неопределенность, в общем-то, не допускается. Т.е. количество, тип и размерность столбцов должны быть известны на этапе разработки. Если же всё это варьируется, то необходим конвертер-стандартизатор. |
8 окт 14, 14:40 [16676687] Ответить | Цитировать Сообщить модератору |
LexusR Member Откуда: Novosibirsk Сообщений: 1887 |
я вам в примере и показал как в заранее созданную внешнюю временную таблицу добавить заранее неизвестные вам поля -те же что и в динамическом запросе |
||
8 окт 14, 14:42 [16676695] Ответить | Цитировать Сообщить модератору |
Северянин Member Откуда: Сообщений: 90 |
Так я потом еще много чего с ней делаю, а потом обработанные данные из приложения вызываю, чтоб мудреный отчет составить. |
||
8 окт 14, 14:44 [16676711] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
А сразу это "много чего" нельзя сделать в том же динамическом запросе ? |
||
8 окт 14, 14:46 [16676725] Ответить | Цитировать Сообщить модератору |
Северянин Member Откуда: Сообщений: 90 |
Glory, Здесь ключевое слово много(чего ещё). И я совсем не уверен, что не понадобится ещё больше. Все запихать в один динамический запрос? Я хочу промежуточные результаты контролировать. |
8 окт 14, 15:01 [16676813] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
И что С временной таблицей придется _меньше_ кода, чем его будет динамическом запросе что ли ?
Типа как вы будете их контролировать с временной таблицей ? |
||||
8 окт 14, 15:05 [16676858] Ответить | Цитировать Сообщить модератору |
Северянин Member Откуда: Сообщений: 90 |
Glory, Может Вы и правы. Идея неплохая. Я подумаю. ------------- Спасибо всем за помощь. |
8 окт 14, 15:12 [16676912] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |