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

Откуда: С-Петербург
Сообщений: 616
Здравствуйте!

если исполняешь какой-то sql скрипт в окне QueryAnalizer
или в более поздних версиях в студии
то создаваемые временные таблицы имена которых начинаются с решетки
живут пока их явно не drop или пока окно не закроешь
а когда из приложения исполняю скрипт
с помощью вызова PreparedStatement
то такие таблицы живут только в пределах одного вызова
вот сейчас подумалось что именно из-за вызова
exec sp_prepexec('.................')
оно так себя ведет потому как все мои таблицы оказываются создаными в процедуре и умирают после ее окончания
может кто подскажет как это можно обойти

спасибо.
25 ноя 13, 17:26    [15186944]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
Glory
Member

Откуда:
Сообщений: 104751
leov
может кто подскажет как это можно обойти

Все происходит именно так, как описано в хелпе.
25 ноя 13, 17:28    [15186954]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Glory,

капитан очевидность, блин :-)
25 ноя 13, 18:03    [15187164]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
Glory
Member

Откуда:
Сообщений: 104751
leov
Glory,

капитан очевидность, блин :-)

Если для вас все так очевидно, то к чему создана эта тема ?
Где найти волшебную установку, чтобы все, что я наговнокодил, стало работать хорошо ?
25 ноя 13, 18:04    [15187170]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Glory,

вам чтоли совсем заняться нечем что даете тут такие пустые и никчемные советы
не хотите отвечать так не отвечайте, это же просто
тот кто хочет - ответит, ну или никто не ответит

я когда тут прашиваю ожидаю что кто-то скажет мне то что я не знаю

в данной ветке я жду ответ можно ли обойти ту ситуацию которую я описал

в ответ получаю - читай хелп.... говнокод.....
25 ноя 13, 18:23    [15187288]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
Glory
Member

Откуда:
Сообщений: 104751
leov
не хотите отвечать так не отвечайте, это же просто

На что отвечать то ?

Как сделать, чтобы сервер не удалял временные таблицы после завершения пакета, в котором они созданы ?
Да никак.
Читай хелп.

Как исправить ваш гавнокод, чтобы он не заворачивал каждую команду в отдельный пакет ?
Так читай хелп по ADO и переписывай код.
25 ноя 13, 18:26    [15187299]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Glory,

спасибо, все-таки можете что-то посоветовать.
теперь бы еще выбросить из ветки весь мусор и говно
25 ноя 13, 18:37    [15187366]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31863
leov
вот сейчас подумалось что именно из-за вызова
exec sp_prepexec('.................')
оно так себя ведет потому как все мои таблицы оказываются создаными в процедуре и умирают после ее окончания
Именно так.
leov
может кто подскажет как это можно обойти
Не вызывать sp_prepexec
25 ноя 13, 19:25    [15187651]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
alexeyvg,

prepexec вызывает odbc jdbc , я этим не управляю
не знаю чтобы можно было этим управлять
25 ноя 13, 20:07    [15187819]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
Заверни весь скрипт в одну хранимую процедуру и всего делов. А с клиента только один вызов этой хранимки. Если что - хранимку можно создать временную (с решеткой) прям на месте перед вызовом, она удалится сама когда сессия закроется.
25 ноя 13, 23:13    [15188390]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Glory
Как исправить ваш гавнокод, чтобы он не заворачивал каждую команду в отдельный пакет ?
Так читай хелп по ADO и переписывай код.
Тут более обширный вопрос. Как кодить так, чтобы не нужны были временные таблицы живущие неопределенно долго.
25 ноя 13, 23:17    [15188404]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31863
leov
prepexec вызывает odbc jdbc , я этим не управляю
не знаю чтобы можно было этим управлять
Странно было бы, если нельзя...

Какая строка коннекта, не устанавливаете свойство selectMethod?

Как выполняете запрос?
25 ноя 13, 23:21    [15188418]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
alexeyvg,

conn = DriverManager.getConnection(url, userId, password);

url=jdbc:sqlserver://localhost:1433;databaseName=MyDbName;sendStringParametersAsUnicode=false

вот такое есть про selectMethod
но это вроде совсем не про то


String

["direct"|"cursor"]


direct


If this property is set to "cursor," a database cursor is created for each query created on the connection for TYPE_FORWARD_ONLY and CONCUR_READ_ONLY cursors. This property is typically required only if the application generates very large result sets that cannot be fully contained in client memory. When this property is set to "cursor," only a limited number of result set rows are retained in client memory. The default behavior is that all result set rows are retained in client memory. This behavior provides the fastest performance when the application is processing all rows.
26 ноя 13, 00:58    [15188724]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
ziktuw,

stored procedure с решеткой?
в первый раз о таком слышу...
действительно есть такое.
надо иметь в виду, может пригодится.
26 ноя 13, 01:16    [15188751]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
alexeyvg
Как выполняете запрос?
как-то вот так

String stmt=new String();
...
ps = cpe.connection.prepareStatement(stmt);
...
ps.setObject(argno, p.value(name,index),Types.VARCHAR);
...
boolean ex = ps.execute(); //execute request
26 ноя 13, 01:23    [15188756]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31863
leov
вот такое есть про selectMethod
но это вроде совсем не про то
Да, похоже не то, это повлияет на sp_cursorprepare...

Попробуйте параметр коннекта prepareSQL
http://jtds.sourceforge.net/faq.html
ValueDescription
0SQL is sent to the server each time without any preparation; literals are inserted in the SQL (slower)
1Temporary stored procedures are created for each unique SQL statement and parameter combination (faster)
2sp_executesql is used (fast)
3sp_prepare and sp_cursorprepare are used in conjunction with sp_execute and sp_cursorexecute (faster; SQL Server only)

26 ноя 13, 09:27    [15189344]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31863
leov
ps = cpe.connection.prepareStatement(stmt);
Мда, ну вот тут вы тоже заворачиваете выполняемый запрос в процедуру...

Будьте проще:
java.sql.Statement stmt =
        con.createStatement();
ResultSet r = stmt.executeQuery("SELECT FirstCol FROM MyTable");
26 ноя 13, 09:29    [15189358]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
alexeyvg
Будьте проще:
да чаще всего там параметров бывает целая куча
поэтому все обращения к серверу именно так и ходят
возможно перед исполнением надо анализировать
есть ли параметры и если нет то вызывать проще
и создание временных таблиц вызывать именно таким образом без параметров
тогда они останутся в коннекте и дальше их можно будет из сложных вызовов увидеть
26 ноя 13, 09:52    [15189495]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
alexeyvg
Попробуйте параметр коннекта prepareSQL

я вот такой драйвер использую и там такого нет
если чего другое не придумается то может и про другой стоит подумать
26 ноя 13, 10:01    [15189543]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31863
leov
alexeyvg
Будьте проще:
да чаще всего там параметров бывает целая куча
поэтому все обращения к серверу именно так и ходят
возможно перед исполнением надо анализировать
есть ли параметры и если нет то вызывать проще
и создание временных таблиц вызывать именно таким образом без параметров
тогда они останутся в коннекте и дальше их можно будет из сложных вызовов увидеть
Понятно, что вызов с Prepare принципиально лучше, быстрее, и защищён от всяких зловредов.

Но для создания временных таблиц уровня коннекта нужно вызывать без параметризации.

leov
там такого нет
Для начала попробуйте без connection.prepareStatement, вдруг прокатит.

Ну и нужно убедиться, что "там такого нет". Не может быть, что бы этим нельзя было управлять.
26 ноя 13, 10:28    [15189679]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
ну вроде прокатило
только теперь другая проблема - как их таки убивать ?
нет ли способа на выходе убивать все имеющиеся #таблицы?
у меня веб-приложение и коннекции не оключаются
если не хватает то они новые открываются
но отключаются только при перезапуске приложения или если broken
можно конечно строго писать drop table ...
но все равно где-то проглядишь и потом вылезет в неподходящий момент
хотя если нет специального способа про который я не знаю
то вот так в общем вполне приемлемо будет
IF OBJECT_ID('tempdb..#test') IS NOT NULL
  DROP TABLE #test

create table #test(id int,val int)


и еще какая-то странная ошибка вылезла
вроде безобидный тест сделал
create table #test(id int,val int)
insert into #test(id,val)values( 1, 11)

а оно вылает
java.sql.SQLException: [Microsoft][ODBC Driver Manager] Function sequence error
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)
at sun.jdbc.odbc.JdbcOdbc.SQLNumResultCols(JdbcOdbc.java:4676)
at sun.jdbc.odbc.JdbcOdbcStatement.getColumnCount(JdbcOdbcStatement.java:1235)
at sun.jdbc.odbc.JdbcOdbcStatement.getResultSet(JdbcOdbcStatement.java:410)
at sun.jdbc.odbc.JdbcOdbcStatement.getResultSet(JdbcOdbcStatement.java:376)
at com......Session.doSelectStmt(Session.java:673)
вроде нет тут никакого резалтсета
должно вернуть null и всего делов
для prepared statement так и происходит, а тут взбрыкивает
27 ноя 13, 00:15    [15195251]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31863
leov
вроде нет тут никакого резалтсета
должно вернуть null и всего делов
Должно вернуть null, или нет рекордсета?

Ну а вообще попробуйте установить set nocount on.
27 ноя 13, 09:09    [15196207]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
alexeyvg,

ну резалтсета то точно нет. я же тут привел весь текст что на серваке выполняется
а валится именно на getResultSet. вероятно баг
set nocount on кстати помогло
вероятно надо во все вызовы его дописать
я видел такие решения но не понимал смысла, поэтому к себе не внедрял
вот теперь увидел
вероятно микрософт этот баг не исправляет потому что все nocount дописывают :-)

а вот с удалением временных таблиц вопрос остался
у меня нашлась куча созданий временных таблиц внутри prepared statement
которые умирают после отработки
но если появятся временные таблицы которые будут жить в коннекте
то они начнут конфликтовать
надо или выработать решение по удалению всех таблиц на выходе
или много чего переписывать
27 ноя 13, 14:55    [15199176]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
Alexander Us
Member

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

У Вас происходит так:
Declare @P1 int;
EXEC sp_prepexec 
@P1 output, 
N'@P1 nvarchar(128)',    
N'CREATE TABLE #T(C1 int); INSERT #T values(3); SELECT * FROM #T', 
NULL

select * from #T -->>table not exists


а надо так?
create table #T(C1 int); --создаёте в временную таблицу

Declare @P1 int; --заполняете
EXEC sp_prepexec 
@P1 output, 
N'@P1 nvarchar(128)',    
N'INSERT #T values(3); SELECT * FROM #T', 
NULL

select * from #T --> получаете данные. Таблица живёт, пока существует коннекшн. 


Ну и мож. пригодится:

CREATE PROCEDURE [dbo].[sp_DropTempTab] @TabName sysname	
AS
BEGIN	
	SET NOCOUNT ON;
    declare @fullname sysname
    declare @sql nvarchar(200)
    
    if isnull(@TabName,'') = ''
      return 
    
    if charindex('#', @TabName) <> 1
      return
    
    set  @fullname='tempdb..' + @TabName    
    
    if object_id(@fullname) > 0 
    begin
       set @sql = N'DROP TABLE ' + @TabName    
       exec sp_executesql @sql
    end
END
27 ноя 13, 15:25    [15199519]     Ответить | Цитировать Сообщить модератору
 Re: время жизни временных таблиц #tab  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Alexander Us
У Вас происходит так:

нет, в данном случае prepexec не происходит
там просто исполнение селекта, в profiler просто SQL:BatchCompleted и все одним блоком
а когда prepexec то ошибка не вылазит
я думаю что это баг драйвера
ну в общем раз оно set nocount on лечится то сойдет и так
27 ноя 13, 15:43    [15199722]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить