我正在使用SQL Server 2016 Service Pack 2,并使用以下代码。它可以在SQL查询语句中正确执行:
SELECT 'a' AS one INTO #deleted;
DROP TABLE IF EXISTS #deleted;
GO
SELECT 'b' AS two INTO #deleted;
DROP TABLE IF EXISTS #deleted;
GO
但是当我拿起 GO 时,我会遇到此错误:
数据库中已经有一个名为“ #deleted”的对象。
如果要使用这种语法创建SP,则不能使用GO。
答案 0 :(得分:2)
正确。如果要使用SELECT INTO语句和介于两者之间的DIE语句在同一批中使用它们,则必须给这两个临时表使用不同的名称。
或者,您可以先创建临时表,同时为两个SELECT语句提供所有必需的列,然后相应地调整SELECT(或与临时表数据一起运行的任何语句)。
例如
BEGIN
DROP TABLE IF EXISTS #deleted ;
CREATE TABLE #deleted ( [one] VARCHAR(5) NULL, [two] VARCHAR(5) NULL ) ;
INSERT INTO #deleted ( [one] )
SELECT 'a' AS [one] ;
INSERT INTO #deleted ( [two] )
SELECT 'b' AS [two] ;
SELECT [one] FROM #deleted WHERE [two] IS NULL ;
SELECT [two] FROM #deleted WHERE [one] IS NULL ;
DROP TABLE IF EXISTS #deleted ;
END
GO
更新1
如前所述,您可以为临时表指定不同的名称。
例如
BEGIN
SELECT 'a' AS [one]
INTO #deleted1 ;
SELECT * FROM #deleted1 ; -- or whatever statements you need to execute
DROP TABLE IF EXISTS #deleted1 ;
SELECT 'b' AS [two]
INTO #deleted2 ;
SELECT * FROM #deleted2 ; -- or whatever statements you need to execute
DROP TABLE IF EXISTS #deleted2 ;
END
GO