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

Откуда:
Сообщений: 2
Доброго времени суток!

Может кто сталкивался с такой вот проблемой. Сервер MS SQL 2008. Есть процедура, внутри которой создается #таблица, с ней производится некая работа (insert, delete, update) и в конце выдается некий резалтсет. То есть ничего особенного, вот пример текста такой процедуры:
CREATE PROCEDURE T_Test
( @Date datetime
)
as
begin
create table #t
( Dt integer
)

INSERT INTO #t
SELECT 1

SELECT * FROM #t

end
Когда выполняешь эту процедуру из MS SQL Server Management Studio (exec T_Test '20110101'), она работает без ошибок. Пробовал толкать средствами VBA из Excel:
Sub test_testproc()
Dim sqlConnetction As Object
Dim sqlCommand As Object
Dim objRecordset As Object

Set sqlConnetction = CreateObject("ADODB.Connection")
Set sqlCommand = CreateObject("ADODB.Command")

' открываем соединение
sqlConnetction.Open "DSN=ySQLServer"
sqlCommand.ActiveConnection = sqlConnetction

sqlCommand.CommandText = "exec T_Test '20110101'"
sqlCommand.Prepared = True

Set objRecordset = sqlCommand.Execute

While Not objRecordset.EOF
strRes = vbNullString
For i = 0 To objRecordset.Fields.Count - 1
strRes = strRes & CStr(objRecordset.Fields(i).Value) & vbTab
Next
objRecordset.MoveNext
Wend

Set sqlCommand = Nothing
Set sqlConnetction = Nothing

End Sub
Замечательно отрабатывает, ошибок нет. В отладчике видно, что рекорсет присутствует и единичка прочитывается. Устновка sqlCommand.Prepared в True, как я понял, заставляет объект, прежде чем толкнуть процедуру, ее верифицировать и компильнуть.
Но когда пробуешь запустить процедуру по линку из Оракла:
declare
i integer;
d_cursor binary_integer;
SQLText varchar2(1000);
begin
d_cursor := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@SQLLink;

SQLText := 'EXEC exec T_Test ''20110101''';

d_cursor := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@SQLLink;
DBMS_HS_PASSTHROUGH.PARSE@SQLLink(d_cursor, SQLText);

i := DBMS_HS_PASSTHROUGH.FETCH_ROW@SQLLink(d_cursor);

DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@SQLLink(d_cursor);
end;
выдает ошибку: Invalid object name '#t'. Код начинает работать, когда предварительно в этой же сессии/линке создаешь эту #таблицу.
А вот сама проблема. Теперь пробую толкнуть эту процедуру из BusinessObjects, Немного о BusinessObjects. Это довольно таки пресловутая в последнее время шняга типа универсального генератора отчетов, типа Crystal Reports. Позволяет через какие то стандарты, например, через ODBC, сконнектиться к базе данных, что то там толкнуть, получить резалтсет и выдать его пользователю в виде отчета. К сожалению, все сделано через кнопки и выбор из списка, поэтому нет возможности создать какие либо #таблицы, можно только толкнуть процедуру. Никаких других серверов и чего то еще, все происходит на локале, используется тот же OBDC'ишный источник. Ошибка та же.
Почему эта ошибка возникает - понятно. Вопрос как ее обойти. Заменить #таблицы на @таблицы нельзя, потому что в этом случае время выполнения процедур увеличивается до часов, как минимум до 40 минут: данных много обрабатывается. Так же совсем учти от любых временных таблиц не получается.
Что я пробовал:
1. Использовал динамический SQL. Все равно говорит, что объект #таблица отсутствует.
2. Пробовал создавать две процедуры: в верхней создавал #таблицу, в нижней ее использовал, в том числе пробовал вызывать нижнюю процедуру с помощью динамического SQL. Но не обманешь...
Прочие танцы с бубнами вокруг #таблицы уже и не вспомню...

Подскажите, плз, где может быть зарыта собака.
29 июн 11, 10:03    [10890821]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с временными #таблицами  [new]
Glory
Member

Откуда:
Сообщений: 104751
Father
Подскажите, плз, где может быть зарыта собака.

Ну так нельзя же при компиляции/парсинге получить информацию о временной таблице, которой еще нет
Хоть как вы обставьте создание этой временной таблицы
29 июн 11, 10:20    [10890907]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с временными #таблицами  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
Father
Подскажите, плз, где может быть зарыта собака.
Посмотрите в профайлере, что посылается сиквелу при вызове из оракла.

Думаю, проблема в предварительном выполнении в режиме проверки метаданных. Если так, нужно поискать какие то опции для вызова из оракла...
С BusinessObjects проще - нужно от него отказаться :-) Что это за "пресловутая в последнее время шняга типа универсального генератора отчетов", которая не позволяет сделать примитивный вызов!
Father
Почему эта ошибка возникает - понятно. Вопрос как ее обойти.
Так если понятно, то и обойти видимо просто :-)
Father
Заменить #таблицы на @таблицы нельзя, потому что в этом случае время выполнения процедур увеличивается до часов
Или как вариант - ускорить работу с таблицами-переменными (типа индекс создать или ещё что то)
29 июн 11, 10:20    [10890915]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с временными #таблицами  [new]
Егоров Александр
Member

Откуда: Хабаровск
Сообщений: 517
Father,

Попробуйте
select 1 as [Result] from #t
30 июн 11, 02:54    [10896622]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с временными #таблицами  [new]
Егоров Александр
Member

Откуда: Хабаровск
Сообщений: 517
Father,

ну и set nocount on в начале процедуры
30 июн 11, 02:54    [10896623]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить