Проблемы параллелизма с временными таблицами в последующих пакетах? - PullRequest
4 голосов
/ 17 октября 2011

У меня иногда возникает проблема при запуске скрипта.У меня есть проблема при использовании приложения (которое я не написал и, следовательно, не могу отладить), которое запускает сценарии.Это приложение возвращает не полную ошибку с SQL Server, а только описание ошибки, поэтому я не знаю точно, где эта ошибка.

У меня ошибка только при использовании этого инструмента (это инструменткоторый отправляет запросы непосредственно на SQL Server, используя компонент DAC), если я запускаю запрос вручную в студии управления, у меня нет ошибки.(Эта ошибка, кроме того, возникает только в конкретной базе данных).

Мой запрос выглядит примерно так:

SELECT * INTO #TEMP_TABLE
  FROM ANOTHER_TABLE 
GO

--some other commands here
GO

INSERT INTO SOME_OTHER_TABLE(FIELD1,FIELD2) 
  SELECT FIELDA, FIELDB
  FROM #TEMP_TABLE  

GO

DROP TABLE #TEMP_TABLE
GO

Я получаю сообщение об ошибке: #TEMP_TABLE не является допустимым объектом

Так или иначе, я подозреваю, что оператор DROP выполняется перед оператором INSERT.

Но AFAIK, когда GO находится там, следующий оператор не выполняется, пока предыдущий не был выполнен.

Теперь яПодозреваю, что это не так с временными таблицами ... Или у вас есть другие идеи?

Ответы [ 2 ]

3 голосов
/ 17 октября 2011

Ваша проблема, скорее всего, вызвана либо окончанием сеанса до DROP TABLE, в результате чего SQL Server автоматически удаляет таблицу, либо DROP TABLE выполняется в сеансе, отличном от другого кода (который был создан и использован временная таблица), в результате чего таблица не будет видна.

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

В этой статье приведено хорошее описание поведения временных временных таблиц для Временные таблицы в SQL Server :

Вы получаете уборку по местным временным таблицам; они есть автоматически удаляется при выходе из области видимости, если явно упал с помощью DROP TABLE. Их область более щедра, чем таблица Переменная, чтобы у вас не было проблем со ссылками на них в пакетах или в динамическом SQL. Локальные временные таблицы удаляются автоматически при конец текущего сеанса или процедуры. Отбрасывание в конце процедура, которая создала это, может вызвать головную боль: местный временная таблица, созданная в рамках хранимой процедуры или сеанса удаляется после завершения, поэтому на него нельзя ссылаться процесс, который вызвал хранимую процедуру, которая создала таблицу. Это однако на него могут ссылаться любые вложенные хранимые процедуры с помощью хранимой процедуры, которая создала таблицу. Если вложенный процедура ссылается на временную таблицу и две временные таблицы с одно и то же имя существует в то время, к какой таблице разрешен запрос против?

1 голос
/ 17 октября 2011

Я бы запустил SQL Profiler и проверил, использует ли ваш инструмент одно соединение для выполнения всех пакетов, или он отключается / повторно подключается.Кроме того, это может быть использование пула соединений.

В любом случае, выполнение пакетов SQL из файла настолько просто, что вы можете очень быстро разработать свой собственный инструмент и быть лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...