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

Откуда: Zaporozhye
Сообщений: 35
Приветствую!

есть скрипт:
declare @tblName nvarchar(250)
set @tblName=N'country'

declare @sQuery nvarchar(4000)
if object_id('tempdb..#t') is not null
drop table #t
set @sQuery = N'select * into #t from '+@tblName
--print @sQuery
exec sp_executesql @sQuery
--do something with #t
select * from #t

на последней строчке получаю:Invalid object name '#t'?
есть идеи как заполнить временную таблицу динамическим запросом?
17 авг 04, 13:17    [887022]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Создав ее предварительно не динамическим, а заполнить динамическим INSERT ...
17 авг 04, 13:21    [887054]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
Dmitry D
Member

Откуда: Zaporozhye
Сообщений: 35
у меня проблема вот какая:
нужно в цикле выполнить обработку нескольких таблиц с разной структурой.
имена таблиц выгребаются из таблицы. их кол-во может меняться. и если захардкодить создание временных таблиц в зависимости от передаваемого параметра, то при добавлении новых нужно будет каждый раз переписыват эту процедуру :(
17 авг 04, 13:27    [887091]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
А вот так не пробовал?
declare @tblName nvarchar(250)
set @tblName=N'country'

declare @sQuery nvarchar(4000)
if object_id('tempdb..#t') is not null
drop table #t
set @sQuery = N'select * into tempdb..#t from '+@tblName
--print @sQuery
exec sp_executesql @sQuery
--do something with #t
select * from tempdb..#t
или может так?
declare @tblName nvarchar(250)
set @tblName=N'country'

declare @sQuery nvarchar(4000)
if object_id('tempdb..##t') is not null
drop table #t
set @sQuery = N'select * into ##t from '+@tblName
--print @sQuery
exec sp_executesql @sQuery
--do something with #t
select * from ##t
17 авг 04, 13:34    [887123]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
create table #t (b bit)
exec('alter table #t add i int')
exec('insert into #t(i) select 1')
select * from #t


для спящего время бодрствования равносильно сну
17 авг 04, 13:35    [887129]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Dmitry D
у меня проблема вот какая:
нужно в цикле выполнить обработку нескольких таблиц с разной структурой.
имена таблиц выгребаются из таблицы. их кол-во может меняться. и если захардкодить создание временных таблиц в зависимости от передаваемого параметра, то при добавлении новых нужно будет каждый раз переписыват эту процедуру :(


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

ЗЫ. Как тока народ не изгаляется.

2 Сергей84

автор
А вот так не пробовал?


а вы сами пробовали. Временная таблица, созданная внутри динамического запроса будет автоматически удалена после его завершения.
17 авг 04, 13:40    [887153]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
Dmitry D
Member

Откуда: Zaporozhye
Сообщений: 35
Сергей84
А вот так не пробовал?
или может так?
declare @tblName nvarchar(250)
set @tblName=N'country'

declare @sQuery nvarchar(4000)
if object_id('tempdb..##t') is not null
drop table #t
set @sQuery = N'select * into ##t from '+@tblName
--print @sQuery
exec sp_executesql @sQuery
--do something with #t
select * from ##t

так пробовал, но не хочется заморачиваться с глобальными временными таблицами - если несколько клиентов одновременно запустят таск?
17 авг 04, 13:44    [887164]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
Dmitry D
Member

Откуда: Zaporozhye
Сообщений: 35
pkarklin

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

ЗЫ. Как тока народ не изгаляется.


ну а если надо? вот реальная задача: нужно закачать данные на сервер с другого сервера. причем, если запись в таблице существует, то обновить ее. если нет, то добавить. таблиц несколько, их имена хранятся в служебной табличке.
если не изгаляться, то как ??

решил проблему след. образом: создал dts package, в нем два таска activex task + execute sql.
activex формирует запрос для exec , ну а тот его выполняет.
17 авг 04, 13:53    [887212]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
ну а если надо? вот реальная задача: нужно закачать данные на сервер с другого сервера. причем, если запись в таблице существует, то обновить ее. если нет, то добавить. таблиц несколько, их имена хранятся в служебной табличке.
если не изгаляться, то как ??


Это вы типа свою репликацию забабахали? Хорошо, что задача вс-таки решена.
17 авг 04, 14:06    [887263]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
Dmitry D
Member

Откуда: Zaporozhye
Сообщений: 35
pkarklin

Это вы типа свою репликацию забабахали? Хорошо, что задача вс-таки решена.

Че смешного-то?
еще не забабахал, в процессе.
17 авг 04, 14:12    [887301]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Dmitry D
pkarklin

Это вы типа свою репликацию забабахали? Хорошо, что задача вс-таки решена.

Че смешного-то?
еще не забабахал, в процессе.


Чем стандартный механизм не подходил?
17 авг 04, 14:21    [887346]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
Dmitry D
Member

Откуда: Zaporozhye
Сообщений: 35
pkarklin

Чем стандартный механизм не подходил?

нет другого способа обмена данными с некоторыми рабочими местами, кроме как при помощи дискет :((
17 авг 04, 14:24    [887366]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Ну хорошо, а этот вариант подойдет?
declare @tblName nvarchar(250)
set @tblName=N'country'

declare @sQuery nvarchar(4000)
if object_id('tempdb..#t') is not null
drop table #t
set @sQuery = N'select * into #t from '+@tblName+'GO select * from #t'
--print @sQuery
exec sp_executesql @sQuery
17 авг 04, 14:41    [887462]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
Ну хорошо, а этот вариант подойдет?


Неа. Он ваше работать не будет.
17 авг 04, 14:44    [887474]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
declare @s varchar(1000), @tname varchar(1000)
set @tname = 'sysobjects'
set @s = ''
select @s = @s + ',' + sc.name + ' ' +
  case
   when st.name like '%char%'
    then st.name + '(' + cast(sc.length as varchar) + ')'
   when st.name in ('decimal','numeric')
    then st.name + '(' + cast(sc.xprec as varchar) + +',' + cast(sc.xscale as varchar) + ')'
   else st.name
  end + ' null'
 from sysobjects so
  join syscolumns sc on so.id = sc.id
  join systypes st on st.xusertype = sc.xusertype
 where so.id = object_id(@tname)
set @s = stuff(@s, 1, 1, '')
create table #t (b int null)
print @s
exec ('alter table #t add ' + @s)
exec ('alter table #t drop column b')
exec ('insert into #t select * from '+ @tname)
select * from #t
drop table #t

для спящего время бодрствования равносильно сну
17 авг 04, 14:49    [887513]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
Alex Kuznetsov
Member

Откуда: Ростов-на-Дону
Сообщений: 1789
А если вот так?

declare @tblName nvarchar(250)
set @tblName=N'country'

declare @sQuery nvarchar(4000)
if object_id('tempdb..#t') is not null
drop table #t
set @sQuery = N'select * into #t from '+@tblName+' select * from #t'
--print @sQuery
exec(@sQuery)

Просто никакий GO ставить не надо. У меня такие скрипты бывает динамические отрабатывают, что сам диву даюсь.
В общем можно промблемку решить.
17 авг 04, 14:53    [887535]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
Dmitry D
Member

Откуда: Zaporozhye
Сообщений: 35
Алексей2003
declare @s varchar(1000), @tname varchar(1000)
set @tname = 'sysobjects'
set @s = ''
select @s = @s + ',' + sc.name + ' ' +
  case
   when st.name like '%char%'
    then st.name + '(' + cast(sc.length as varchar) + ')'
   when st.name in ('decimal','numeric')
    then st.name + '(' + cast(sc.xprec as varchar) + +',' + cast(sc.xscale as varchar) + ')'
   else st.name
  end + ' null'
 from sysobjects so
  join syscolumns sc on so.id = sc.id
  join systypes st on st.xusertype = sc.xusertype
 where so.id = object_id(@tname)
set @s = stuff(@s, 1, 1, '')
create table #t (b int null)
print @s
exec ('alter table #t add ' + @s)
exec ('alter table #t drop column b')
exec ('insert into #t select * from '+ @tname)
select * from #t
drop table #t

работает, как мне нужно, спасибо.
собственно, такой вариант рассматривался, только с information_schema.columns. но смысл от этого не меняется.
17 авг 04, 15:01    [887574]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
ASvet
Member

Откуда:
Сообщений: 10
Спасибо Алексей, хороший пример!
23 авг 04, 21:30    [902447]     Ответить | Цитировать Сообщить модератору
 Re: временная таблица и динамический запрос  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
а если все втолкать в динамику ?
declare @sQuery nvarchar(4000), @tblName nvarchar(100)
set @tblName = N'sysobjects'
if object_id('tempdb..#t') is not null
  drop table #t
set @sQuery = N'select * into #t from '+@tblName+' select * from #t'
exec sp_executesql @sQuery
24 авг 04, 06:39    [902634]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить