Я использую следующий код, чтобы проверить, существует ли временная таблица и удалить таблицу, если она существует, прежде чем создавать снова. Работает нормально, пока я не меняю столбцы. Если я добавлю столбец позже, он выдаст ошибку «неверный столбец». Пожалуйста, дайте мне знать, что я делаю неправильно.
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
)
select company, stepid, fieldid from #Results
--Works fine to this point
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
NewColumn NVARCHAR(50)
)
select company, stepid, fieldid, NewColumn from #Results
--Does not work
BEGIN TRANSACTION; CREATE TABLE #Results; ...; DROP TABLE #Results; COMMIT
. Если транзакция завершится успешно, таблица будет удалена. Если произойдет сбой, таблица также исчезнет (поскольку она была создана в транзакции). В любом случае: нет необходимости проверять, существует ли таблица.Ответы:
Я не могу воспроизвести ошибку.
Возможно, я не понимаю проблемы.
Следующее прекрасно работает для меня в SQL Server 2005, с дополнительным столбцом «foo», появляющимся во втором результате выбора:
источник
'tempdb..#name'
это именно то, что мне было нужно. Я использовал'dbo.#name'
, как дурак. Я получилtempdb
часть, но что с двойными точками?Заявление должно быть порядка
Без 'GO' между ними все будет рассматриваться как один отдельный скрипт, и когда оператор select ищет столбец, он не будет найден.
С 'GO', он будет рассматривать часть скрипта до 'GO' как один пакет и будет выполняться перед тем, как войти в запрос после 'GO'.
источник
Вместо того, чтобы
dropping
и заново создать временную таблицу, вы можетеtruncate
и повторно использовать ееЕсли вы используете
Sql Server 2016
илиAzure Sql Database
затем используете приведенный ниже синтаксис, чтобы удалить временную таблицу и воссоздать ее. Больше информации здесь MSDNСинтаксис
Запрос:
источник
truncate/reuse
метод будет более эффективным , чемDROP TABLE IF EXISTS
наSql Server 2016
и ,Azure Sql Database
а также. Разве это не так?DROP TABLE IF Exists
для SQL 2016 или Azure? Синтаксис доступен начиная с SQL 2008. См. Ссылку MSDN в своем ответе? Фактор производительности?DROP TABLE
что поддерживается SQL Server 2008, ноIF EXISTS
предложение было введено в 2016 году.INTO
: выберите * INTO #HistoricoUserTable из dbo.HistoricoUserЯ думаю, проблема в том, что вам нужно добавить оператор GO между ними, чтобы разделить выполнение на пакеты. Как второй сценарий удаления, т.е.
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
не удалял временную таблицу, являющуюся частью одного пакета. Можете ли вы попробовать скрипт ниже.источник
tempdb..
в приведенном выше коде это очень важно. Это должно предшествовать вашему имени временной таблицы. Просто проверкиOBJECT_ID('#Results')
недостаточно. Временные таблицы хранятся в базе данных TempDB. По Microsoft: системная база данных TempDB - это глобальный ресурс, который доступен всем пользователям, подключенным к экземпляру SQL Server или подключенным к базе данных SQLtempdb
иначе оно не исчезнет.Это можно сделать с помощью одной строки кода:
источник
Это сработало для меня: social.msdn.microsoft.com/Forums/en/transactsql/thread/02c6da90-954d-487d-a823-e24b891ec1b0?prof=required
источник
Просто небольшой комментарий с моей стороны, так как
OBJECT_ID
у меня не работает. Это всегда возвращает это..even хотя это делает существует. Я только что обнаружил, что он хранится под другим именем (с
_
подчеркиванием), например:#tempTable________
Это хорошо работает для меня:
источник
Теперь вы можете использовать приведенный ниже синтаксис, если вы используете одну из новых версий SQL Server (2016+).
источник
Incorrect syntax near the keyword 'IF'.
IF [NOT] EXISTS
доступно в SQL Server 2016. Неважно, какую версию SSMS вы используете.pmac72 использует GO для разбиения запроса на пакеты и использует ALTER.
Вы, кажется, запускаете тот же пакет, но запускаете его дважды после изменения: DROP ... CREATE ... edit ... DROP ... CREATE ..
Возможно, опубликуйте свой точный код, чтобы мы могли видеть, что происходит.
источник
Я обычно сталкиваюсь с этой ошибкой, когда я уже создал временную таблицу; код, который проверяет оператор SQL на наличие ошибок, видит «старую» временную таблицу на месте и возвращает неверный счетчик числа столбцов в последующих операторах, как если бы временная таблица никогда не удалялась.
После изменения количества столбцов во временной таблице после создания версии с меньшим количеством столбцов удалите таблицу и, затем, выполните свой запрос.
источник
Я недавно видел, как администратор баз данных делал что-то похожее на это:
источник
Мой код использует
Source
таблицу, которая изменяется, иDestination
таблицу, которая должна соответствовать этим изменениям.источник
Да, «неверный столбец» эта ошибка возникла из строки «выберите компанию, stepid, fieldid, NewColumn from #Results».
Есть две фазы запуска t-sql,
во-первых, на этом этапе сервер sql проверяет исправление введенной вами строки sql, включая столбец таблицы, и оптимизирует ваш запрос для максимально быстрого получения.
во-вторых, бег, извлечение данных.
Если таблица #Results существует, то процесс синтаксического анализа проверит, что указанные вами столбцы действительны или нет, иначе (таблица не существует) синтаксический анализ будет выполнен путем пропуска проверочных столбцов, как вы указали.
источник
Когда вы изменяете столбец во временной таблице, вы должны удалить таблицу перед повторным запуском запроса. (Да, это раздражает. Просто то, что вы должны сделать.)
Я всегда предполагал, что это потому, что проверка «недопустимого столбца» выполняется парсером до запуска запроса, поэтому он основан на столбцах таблицы, прежде чем он будет отброшен ..... и это то, что также сказал pnbs.
источник