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

Откуда:
Сообщений: 12775
MS SQL 2008, VBS, ADO, SQL Server Native Client 10.0

Мне надо создать временную таблицу а потом сделать из нее выборку. Пишу в скрипте:
set conn = CreateObject("ADODB.Connection")
conn.Open "DSN=MySQLServer2008;UID=***;PWD=***"

set rs = conn.Execute("set nocount on; select id into #tmp from realtable where id=123; select * from #tmp")
do while not rs.eof
	wscript.echo rs(0)
	rs.MoveNext
loop

wscript.echo "-----"

set rs = conn.Execute("select * from #tmp")
do while not rs.eof
	wscript.echo rs(0)
	rs.MoveNext
loop

rs.Close
conn.Close

Получаю на выходе:

123
-----
C:\Projects\testTempTables.vbs(14, 1) Microsoft OLE DB Provider for ODBC Drivers: [Microsoft][SQL Server Native Client 10.0][SQL Server]Invalid object name '#tmp'.

Если я правильно понимаю, то область видимости временных таблиц внутри пакета. Как ее сделать на всю сессию? Или как решить подобную задачу?
Вариант с запихиванием всей обработки данных и выдачу результатов в один пакет не очень желателен - очень уж много переделывать прийдется.
26 янв 12, 19:36    [11978933]     Ответить | Цитировать Сообщить модератору
 Re: #tmp and VBS  [new]
Alexandr Kr.
Member

Откуда: Украина, Харьков
Сообщений: 165
White Owl,

Может попробовать вместо объявления #tmp сделать ##tmp?
26 янв 12, 19:55    [11979018]     Ответить | Цитировать Сообщить модератору
 Re: #tmp and VBS  [new]
White Owl
Member

Откуда:
Сообщений: 12775
Нее... ## делать нельзя, оно ж иначе будет конфликтовать между разными юзерами.

А вообще, MSDN утверждает:
http://msdn.microsoft.com/en-us/library/ms177399.aspx
Local temporary tables have a single number sign (#) as the first character of their names; they are visible only to the current connection for the user, and they are deleted when the user disconnects from the instance of SQL Server. Global temporary tables have two number signs (##) as the first characters of their names; they are visible to any user after they are created, and they are deleted when all users referencing the table disconnect from the instance of SQL Server.
Одно из двух, либо MSDN врет, либо связка из ADO + SQL Server Native Client 10.0 делает два отдельных коннекта к серверу несмотря на то, что этого никто не просит...
26 янв 12, 20:11    [11979094]     Ответить | Цитировать Сообщить модератору
 Re: #tmp and VBS  [new]
White Owl
Member

Откуда:
Сообщений: 12775
Хотя как быстрое и грязное решение, использование глобальных временных таблиц действительно сработало.
Но я все равно не понимаю почему вдруг у локальной таблицы видимость сузилась с заявленного в документации коннекта, до вообще не упоминавшегося документацией пакета?
26 янв 12, 20:18    [11979133]     Ответить | Цитировать Сообщить модератору
 Re: #tmp and VBS  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
White Owl
Хотя как быстрое и грязное решение, использование глобальных временных таблиц действительно сработало.
Но я все равно не понимаю почему вдруг у локальной таблицы видимость сузилась с заявленного в документации коннекта, до вообще не упоминавшегося документацией пакета?
Пакет в документации упоминается, но и в коннекте ваш способ тоже должен работать.

Разбирайтесь с приложением - либо оно закрывает коннект, либо оборачивает ваш запрос в ХП.
26 янв 12, 20:31    [11979219]     Ответить | Цитировать Сообщить модератору
 Re: #tmp and VBS  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
White Owl,
conn.Open "Provider='sqloledb';Data Source=что-то там;User ID=***;Password=***;"

а так работает?
26 янв 12, 20:45    [11979310]     Ответить | Цитировать Сообщить модератору
 Re: #tmp and VBS  [new]
White Owl
Member

Откуда:
Сообщений: 12775
Сергей Мишин
White Owl,
conn.Open "Provider='sqloledb';Data Source=что-то там;User ID=***;Password=***;"

а так работает?
А так работает!
Большое спасибо.

Значит дело действительно в ODBC драйвере, что-то эта зараза там химичит непотребное.
26 янв 12, 21:19    [11979478]     Ответить | Цитировать Сообщить модератору
 Re: #tmp and VBS  [new]
Glory
Member

Откуда:
Сообщений: 104751
White Owl
Одно из двух, либо MSDN врет, либо связка из ADO + SQL Server Native Client 10.0 делает два отдельных коннекта к серверу несмотря на то, что этого никто не просит...

Либо коннект закрывается
Оба предположения легко проверить, выбрав запросом номер коннекта
26 янв 12, 21:51    [11979612]     Ответить | Цитировать Сообщить модератору
 Re: #tmp and VBS  [new]
White Owl
Member

Откуда:
Сообщений: 12775
Нет, все-таки я чего-то не понимаю.
set conn = CreateObject("ADODB.Connection")
conn.Open "Provider='sqloledb';Data Source=server.com;User ID=***;Password=***;"

set rs = conn.Execute("set nocount on; " & _
	"select * into #tmp from realtable where id in (1, 2, 3); " & _
	"delete from #tmp where id=1; " & _
	"select * from #tmp")
do while not rs.eof
	wscript.echo rs(0)
	rs.MoveNext
loop

wscript.echo "-----"

set rs = conn.Execute("select * from #tmp")
do while not rs.eof
	wscript.echo rs(0)
	rs.MoveNext
loop

rs.Close
conn.Close

Так работает.


A вот так опять не работает:
set conn = CreateObject("ADODB.Connection")
conn.Open "Provider='sqloledb';Data Source=server.com;User ID=***;Password=***;"

set rs = conn.Execute("set nocount on; " & _
	"select * into #tmp from realtable where id in (1, 2, 3); " & _
	"delete from #tmp where id=1; " & _
	"select * from #tmp; " & _
	"delete from #tmp where id=2")
do while not rs.eof
	wscript.echo rs(0)
	rs.MoveNext
loop

wscript.echo "-----"

set rs = conn.Execute("select * from #tmp")
do while not rs.eof
	wscript.echo rs(0)
	rs.MoveNext
loop

rs.Close
conn.Close

Опять падает на втором вызове Execute с той же самой ошибкой об отсутствии #tmp.
26 янв 12, 22:01    [11979646]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить