如何强制 drop temp table 命令完全删除 table?
How do I force a drop temp table command to fully drop the table?
我正在编写脚本,只是在试验和开发。我所做的很多工作都涉及临时 tables,我将 select ... into #SomeTable from ...
,至少在最初的 experimentation/early 开发阶段。
那我看看结果,做一些修改,再去。但是为了让我自己轻松一点,我还有一个 drop table if exists #SomeTable
,所以我可以重新 运行 代码。到目前为止,一切都很好。但是,如果我向临时 table 添加一列然后尝试访问它,我会收到错误 Invalid column name 'newColumn'
。我可以通过仅执行 drop 语句然后执行整个脚本来避免错误,但我宁愿不必这样做。据我了解,有一些 temp tables 的缓存在继续,我想知道这是否是罪魁祸首。无论如何,有什么办法可以解决这个问题吗?
编辑:这是一个演示问题的简短脚本。 运行 脚本,然后取消注释并再次 运行 注释:
drop table if exists #DemoTable
select column1 = '1'
,column2 = '2'
-- ,column3 = '3'
into #DemoTable
select column1
,column2
-- ,column3
from #DemoTable
我已尝试按照问题中提到的步骤进行操作。
请使用 Northwind 数据库查找以下查询示例。
向临时文件中添加了一个新列 table 并成功更新了它。
-- Create the temporary table #temp_Employees from a physical table called 'Employee' in schema 'dbo' in database 'Northwind'
SELECT EmployeeID, FirstName, LastName , BirthDate
INTO #temp_Employees
FROM [Northwind].[dbo].[Employees]
-- SELECT data from temptable '[#temp_Employees]'
SELECT * FROM #temp_Employees;
-- Add a new column '[City]' to table '[#temp_Employees]'
ALTER TABLE #temp_Employees
ADD [City] NVARCHAR(15) NULL
GO
-- SELECT data from temptable '[#temp_Employees]'
SELECT * FROM #temp_Employees;
-- UPDATE the new column '[City]' in the table '[#temp_Employees]'
UPDATE T
SET T.[City]=E.[City]
FROM #temp_Employees T INNER JOIN [Northwind].[dbo].[Employees] E ON T.EmployeeID=E.EmployeeID;
-- SELECT data from temptable '[#temp_Employees]'
SELECT * FROM #temp_Employees;
-- Drop the temptable if it already exists
IF OBJECT_ID('tempDB..#temp_Employees', 'U') IS NOT NULL
DROP TABLE #temp_Employees;
GO
-- SELECT data from temptable '[#temp_Employees]'
SELECT * FROM #temp_Employees;
谢谢。
在 SSMS 中,您只需添加一条 GO
语句即可将代码分成两批。
这样 drop
在检查脚本的第二部分是否有错误之前执行。
drop table if exists #DemoTable
GO
select column1 = '1'
,column2 = '2'
-- ,column3 = '3'
into #DemoTable
select column1
,column2
-- ,column3
from #DemoTable
我正在编写脚本,只是在试验和开发。我所做的很多工作都涉及临时 tables,我将 select ... into #SomeTable from ...
,至少在最初的 experimentation/early 开发阶段。
那我看看结果,做一些修改,再去。但是为了让我自己轻松一点,我还有一个 drop table if exists #SomeTable
,所以我可以重新 运行 代码。到目前为止,一切都很好。但是,如果我向临时 table 添加一列然后尝试访问它,我会收到错误 Invalid column name 'newColumn'
。我可以通过仅执行 drop 语句然后执行整个脚本来避免错误,但我宁愿不必这样做。据我了解,有一些 temp tables 的缓存在继续,我想知道这是否是罪魁祸首。无论如何,有什么办法可以解决这个问题吗?
编辑:这是一个演示问题的简短脚本。 运行 脚本,然后取消注释并再次 运行 注释:
drop table if exists #DemoTable
select column1 = '1'
,column2 = '2'
-- ,column3 = '3'
into #DemoTable
select column1
,column2
-- ,column3
from #DemoTable
我已尝试按照问题中提到的步骤进行操作。
请使用 Northwind 数据库查找以下查询示例。 向临时文件中添加了一个新列 table 并成功更新了它。
-- Create the temporary table #temp_Employees from a physical table called 'Employee' in schema 'dbo' in database 'Northwind'
SELECT EmployeeID, FirstName, LastName , BirthDate
INTO #temp_Employees
FROM [Northwind].[dbo].[Employees]
-- SELECT data from temptable '[#temp_Employees]'
SELECT * FROM #temp_Employees;
-- Add a new column '[City]' to table '[#temp_Employees]'
ALTER TABLE #temp_Employees
ADD [City] NVARCHAR(15) NULL
GO
-- SELECT data from temptable '[#temp_Employees]'
SELECT * FROM #temp_Employees;
-- UPDATE the new column '[City]' in the table '[#temp_Employees]'
UPDATE T
SET T.[City]=E.[City]
FROM #temp_Employees T INNER JOIN [Northwind].[dbo].[Employees] E ON T.EmployeeID=E.EmployeeID;
-- SELECT data from temptable '[#temp_Employees]'
SELECT * FROM #temp_Employees;
-- Drop the temptable if it already exists
IF OBJECT_ID('tempDB..#temp_Employees', 'U') IS NOT NULL
DROP TABLE #temp_Employees;
GO
-- SELECT data from temptable '[#temp_Employees]'
SELECT * FROM #temp_Employees;
谢谢。
在 SSMS 中,您只需添加一条 GO
语句即可将代码分成两批。
这样 drop
在检查脚本的第二部分是否有错误之前执行。
drop table if exists #DemoTable
GO
select column1 = '1'
,column2 = '2'
-- ,column3 = '3'
into #DemoTable
select column1
,column2
-- ,column3
from #DemoTable