SQL 具有多个批次的服务器存储过程 - 重用临时文件 table
SQL Server Stored Procedure with multiple batches - reuse of temp table
我有一个简短的 SQL 脚本,已经使用了一段时间。它在脚本中重用了一个临时 table 并且运行良好。
最近,我决定将这整件事放到一个过程中,尽管我有一个惊喜在等着我——使用关键字 GO
来将脚本分成两批(这就是我能够重用临时 table 的方式)- 这就是 SQL 服务器对我狂吠的原因。
这是一个显示脚本功能的简化脚本:
DROP TABLE IF EXISTS #temp;
SELECT
'john' AS first_name
,'doe' AS last_name
INTO #temp;
SELECT * FROM #temp
GO
TRUNCATE TABLE #temp;
DROP TABLE #temp;
SELECT
'jane' AS first_name
,'doe' AS last_name
INTO #temp;
以下是我在此过程中尝试执行的操作,尽管没有成功:
CREATE PROCEDURE #temp_proc
AS
BEGIN
DROP TABLE IF EXISTS #temp;
SELECT
'john' AS first_name
,'doe' AS last_name
INTO #temp;
SELECT * FROM #temp
GO
TRUNCATE TABLE #temp;
DROP TABLE #temp;
SELECT
'jane' AS first_name
,'doe' AS last_name
INTO #temp;
END
这是我在尝试创建过程时收到的错误消息:
Msg 102, Level 15, State 1, Procedure #temp_proc, Line 10 [Batch Start Line 0]
Incorrect syntax near '#temp'.
Msg 102, Level 15, State 1, Line 20
Incorrect syntax near 'END'.
Objective:我想继续重复使用相同的临时 table 名称,尽管我想将所有这些都放在一个过程中.有什么想法吗?
您不能在存储过程中使用 GO。如果您删除它,您的代码应该 运行 符合预期。虽然没有必要 t运行cate table 如果你稍后删除它。
除了删除代码中的 GO 之外,您不能在存储过程中删除并重新创建相同的临时文件 table; SQL 服务器忽略删除并尝试在两个 SELECT INTO 语句中创建相同的 # table。
抱歉,不,您不了解 GO。它是应用程序理解和实现的关键字。它指示 应用程序 获取所有前面的脚本文本(直到脚本开头或前一个 GO)并将其发送到数据库引擎以供执行。您的过程创建脚本被解释和执行为 2 个单独的批次(这就是为什么 GO 被称为批次分隔符)。第一个是:
CREATE PROCEDURE #temp_proc
AS
BEGIN
DROP TABLE IF EXISTS #temp;
SELECT
'john' AS first_name
,'doe' AS last_name
INTO #temp;
SELECT * FROM #temp
GO
其次是:
TRUNCATE TABLE #temp;
DROP TABLE #temp;
SELECT
'jane' AS first_name
,'doe' AS last_name
INTO #temp;
END
请注意,这只是 创建 您的程序。它与过程的执行方式无关。这里没有什么可利用的 - 您不能使用 "go" 将过程定义或执行分成批次。因此,很简单,如果不进行更改,您的想法和方向是不可能的。动态 sql 是一种可能性 - 但这是一种复杂程度,会给您带来挑战和负担。
我有一个简短的 SQL 脚本,已经使用了一段时间。它在脚本中重用了一个临时 table 并且运行良好。
最近,我决定将这整件事放到一个过程中,尽管我有一个惊喜在等着我——使用关键字 GO
来将脚本分成两批(这就是我能够重用临时 table 的方式)- 这就是 SQL 服务器对我狂吠的原因。
这是一个显示脚本功能的简化脚本:
DROP TABLE IF EXISTS #temp;
SELECT
'john' AS first_name
,'doe' AS last_name
INTO #temp;
SELECT * FROM #temp
GO
TRUNCATE TABLE #temp;
DROP TABLE #temp;
SELECT
'jane' AS first_name
,'doe' AS last_name
INTO #temp;
以下是我在此过程中尝试执行的操作,尽管没有成功:
CREATE PROCEDURE #temp_proc
AS
BEGIN
DROP TABLE IF EXISTS #temp;
SELECT
'john' AS first_name
,'doe' AS last_name
INTO #temp;
SELECT * FROM #temp
GO
TRUNCATE TABLE #temp;
DROP TABLE #temp;
SELECT
'jane' AS first_name
,'doe' AS last_name
INTO #temp;
END
这是我在尝试创建过程时收到的错误消息:
Msg 102, Level 15, State 1, Procedure #temp_proc, Line 10 [Batch Start Line 0]
Incorrect syntax near '#temp'.Msg 102, Level 15, State 1, Line 20
Incorrect syntax near 'END'.
Objective:我想继续重复使用相同的临时 table 名称,尽管我想将所有这些都放在一个过程中.有什么想法吗?
您不能在存储过程中使用 GO。如果您删除它,您的代码应该 运行 符合预期。虽然没有必要 t运行cate table 如果你稍后删除它。
除了删除代码中的 GO 之外,您不能在存储过程中删除并重新创建相同的临时文件 table; SQL 服务器忽略删除并尝试在两个 SELECT INTO 语句中创建相同的 # table。
抱歉,不,您不了解 GO。它是应用程序理解和实现的关键字。它指示 应用程序 获取所有前面的脚本文本(直到脚本开头或前一个 GO)并将其发送到数据库引擎以供执行。您的过程创建脚本被解释和执行为 2 个单独的批次(这就是为什么 GO 被称为批次分隔符)。第一个是:
CREATE PROCEDURE #temp_proc
AS
BEGIN
DROP TABLE IF EXISTS #temp;
SELECT
'john' AS first_name
,'doe' AS last_name
INTO #temp;
SELECT * FROM #temp
GO
其次是:
TRUNCATE TABLE #temp;
DROP TABLE #temp;
SELECT
'jane' AS first_name
,'doe' AS last_name
INTO #temp;
END
请注意,这只是 创建 您的程序。它与过程的执行方式无关。这里没有什么可利用的 - 您不能使用 "go" 将过程定义或执行分成批次。因此,很简单,如果不进行更改,您的想法和方向是不可能的。动态 sql 是一种可能性 - 但这是一种复杂程度,会给您带来挑战和负担。