Проверьте, существует ли временная таблица и удаляется ли она, прежде чем создавать временную таблицу
Я использую следующий код, чтобы проверить, существует ли временная таблица, и отбросить таблицу, если она существует до создания снова. Он отлично работает, пока я не меняю столбцы. Если я добавлю столбец позже, он даст сообщение об ошибке "Недопустимый столбец". Пожалуйста, дайте мне знать, что я делаю неправильно.
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
Ответы
Ответ 1
Я не могу воспроизвести ошибку.
Возможно, я не понимаю проблему.
Следующее работает отлично для меня в SQL Server 2005, а дополнительный столбец "foo" появляется во втором результате выбора:
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO
CREATE TABLE #Results ( Company CHAR(3), StepId TINYINT, FieldId TINYINT )
GO
select company, stepid, fieldid from #Results
GO
ALTER TABLE #Results ADD foo VARCHAR(50) NULL
GO
select company, stepid, fieldid, foo from #Results
GO
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO
Ответ 2
Утверждение должно быть порядка
- Оператор Alter для таблицы
- GO
- Выберите оператор.
Без "GO" между ними все будет рассматриваться как один единственный script, и когда оператор select ищет столбец, он не будет найден.
С "GO" он рассмотрит часть script до "GO" как одну партию и выполнит перед тем, как войти в запрос после "GO".
Ответ 3
Вместо dropping
и повторного создания таблицы temp вы можете truncate
и повторно использовать его
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
Truncate TABLE #Results
else
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
)
Если вы используете Sql Server 2016
или Azure Sql Database
, используйте синтаксис ниже, чтобы удалить таблицу temp и воссоздать ее. Подробнее здесь MSDN
Синтаксис
ТАБЛИЦА DROP [IF EXISTS] [имя_базы. [имя_схемы]. | имя_схемы. ] table_name [,... n]
Query:
DROP TABLE IF EXISTS tempdb.dbo.#Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
)
Ответ 4
Я думаю, проблема в том, что вам нужно добавить соглашение GO между ними для разделения исполнения на партии. Поскольку вторая капля script т.е. IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
не отбрасывала временную таблицу, являющуюся частью отдельной партии. Не могли бы вы попробовать ниже script.
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
)
GO
select company, stepid, fieldid from #Results
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
NewColumn NVARCHAR(50)
)
GO
select company, stepid, fieldid, NewColumn from #Results
Ответ 5
Это сработало для меня:
social.msdn.microsoft.com/Forums/en/transactsql/thread/02c6da90-954d-487d-a823-e24b891ec1b0?prof=required
if exists (
select * from tempdb.dbo.sysobjects o
where o.xtype in ('U')
and o.id = object_id(N'tempdb..#tempTable')
)
DROP TABLE #tempTable;
Ответ 6
Просто небольшой комментарий с моей стороны, так как OBJECT_ID
не работает для меня. Он всегда возвращает, что
`#tempTable не существует
.. хотя он существует. Я просто нашел его сохраненным с другим именем (с пометкой _
подчеркивания) следующим образом:
#tempTable________
Это хорошо работает для меня:
IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#tempTable%') BEGIN
DROP TABLE #tempTable;
END;
Ответ 7
Это может быть достигнуто с помощью одной строки кода:
IF OBJECT_ID('tempdb..#tempTableName') IS NOT NULL DROP TABLE #tempTableName;
Ответ 8
pmac72 использует GO для разбивки запроса на партии и использования ALTER.
Кажется, что вы запускаете ту же самую партию, но запускаете ее дважды после ее изменения: DROP... CREATE... edit... DROP... CREATE..
Возможно, разместите свой точный код, чтобы мы могли видеть, что происходит.
Ответ 9
Я обычно ударяю эту ошибку, когда я уже создал временную таблицу; код, который проверяет инструкцию SQL для ошибок, видит "старую" таблицу temp на месте и возвращает ошибку в количестве столбцов в более поздних операциях, как если бы временная таблица никогда не удалялась.
После изменения количества столбцов в таблице temp после создания версии с меньшим количеством столбцов отбросьте таблицу и THEN запустите свой запрос.
Ответ 10
Теперь вы можете использовать приведенный ниже синтаксис, если вы используете одну из новых версий SQL Server (2016+).
DROP TABLE IF EXISTS schema.yourtable(even temporary tables #...)
Ответ 11
Недавно я увидел, что DBA делает что-то похожее на это:
begin try
drop table #temp
end try
begin catch
print 'table does not exist'
end catch
create table #temp(a int, b int)
Ответ 12
В моем коде используется таблица Source
, которая изменяется, и таблица Destination
, которая должна соответствовать этим изменениям.
--
-- Sample SQL to update only rows in a "Destination" Table
-- based on only rows that have changed in a "Source" table
--
--
-- Drop and Create a Temp Table to use as the "Source" Table
--
IF OBJECT_ID('tempdb..#tSource') IS NOT NULL drop table #tSource
create table #tSource (Col1 int, Col2 int, Col3 int, Col4 int)
--
-- Insert some values into the source
--
Insert #tSource (Col1, Col2, Col3, Col4) Values(1,1,1,1)
Insert #tSource (Col1, Col2, Col3, Col4) Values(2,1,1,2)
Insert #tSource (Col1, Col2, Col3, Col4) Values(3,1,1,3)
Insert #tSource (Col1, Col2, Col3, Col4) Values(4,1,1,4)
Insert #tSource (Col1, Col2, Col3, Col4) Values(5,1,1,5)
Insert #tSource (Col1, Col2, Col3, Col4) Values(6,1,1,6)
--
-- Drop and Create a Temp Table to use as the "Destination" Table
--
IF OBJECT_ID('tempdb..#tDest') IS NOT NULL drop Table #tDest
create table #tDest (Col1 int, Col2 int, Col3 int, Col4 int)
--
-- Add all Rows from the Source to the Destination
--
Insert #tDest
Select Col1, Col2, Col3, Col4 from #tSource
--
-- Look at both tables to see that they are the same
--
select *
from #tSource
Select *
from #tDest
--
-- Make some changes to the Source
--
update #tSource
Set Col3=19
Where Col1=1
update #tSource
Set Col3=29
Where Col1=2
update #tSource
Set Col2=38
Where Col1=3
update #tSource
Set Col2=48
Where Col1=4
--
-- Look at the Differences
-- Note: Only 4 rows are different. 2 Rows have remained the same.
--
Select Col1, Col2, Col3, Col4
from #tSource
except
Select Col1, Col2, Col3, Col4
from #tDest
--
-- Update only the rows that have changed
-- Note: I am using Col1 like an ID column
--
Update #tDest
Set Col2=S.Col2,
Col3=S.Col3,
Col4=S.Col4
From ( Select Col1, Col2, Col3, Col4
from #tSource
except
Select Col1, Col2, Col3, Col4
from #tDest
) S
Where #tDest.Col1=S.Col1
--
-- Look at the tables again to see that
-- the destination table has changed to match
-- the source table.
select *
from #tSource
Select *
from #tDest
--
-- Clean Up
--
drop table #tSource
drop table #tDest
Ответ 13
Да, "неверный столбец" эта ошибка возникла из строки "выберите компанию, stepid, fieldid, NewColumn from #Results".
Есть две фазы запуска t-sql,
во-первых, на этом этапе сервер sql проверяет исправление введенной вами строки sql, включая столбец таблицы, и оптимизирует ваш запрос для максимально быстрого получения.
во-вторых, бег, извлечение данных.
Если таблица #Results существует, то процесс синтаксического анализа проверит, что указанные вами столбцы действительны или нет, иначе (таблица не существует) синтаксический анализ будет выполнен путем пропуска проверочных столбцов, как вы указали.
Ответ 14
CREATE TABLE #tempTable (id int IDENTITY(1, 1) PRIMARY KEY, name nvarchar(500), value nvarchar(500))
BEGIN TRY
DELETE FROM #tempTable
PRINT 'Table deleted'
END TRY
BEGIN CATCH
PRINT 'Table does not exist'
END CATCH