Sql 在一个脚本中创建两个可能的存储过程之一
我想做一个检查(if语句),然后创建两个可能的过程之一 现在我正在尝试在Sql 在一个脚本中创建两个可能的存储过程之一,sql,sql-server-2008,stored-procedures,proc,Sql,Sql Server 2008,Stored Procedures,Proc,我想做一个检查(if语句),然后创建两个可能的过程之一 现在我正在尝试在创建过程语句中使用IF EXISTS语句 CREATE PROCEDURE [dbo].[TestProc] AS SET NOCOUNT ON SET ANSI_NULLS ON SET QUOTED_IDENTIFIER OFF IF EXISTS (select * from table) BEGIN DECLARE @region NVARCHAR(100) SELECT * INTO #TempTable F
创建过程
语句中使用IF EXISTS
语句
CREATE PROCEDURE [dbo].[TestProc]
AS
SET NOCOUNT ON
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER OFF
IF EXISTS (select * from table)
BEGIN
DECLARE @region NVARCHAR(100)
SELECT *
INTO #TempTable
FROM User
…做一些有诱惑力的事情
DROP #TempTable
END
ELSE
BEGIN
DECLARE @region NVARCHAR(100)
SELECT *
INTO #TempTable
FROM User
…用#诱人的等做些别的事情
DROP #TempTable
END
我得到以下两个错误
There is already an object named 'TempTable' in the database.
The variable name '@region' has already been declared. Variable names must be unique within a query batch or stored procedure.
a)首先在存储过程中创建临时表,然后使用插入(…)选择…
填充它,或者b)在两个分支中为临时表使用不同的名称
T-SQL解析器是一个非常简单的beast,控制流不会影响其对哪些对象存在或不存在的解释-因此,如果在if
的一个分支中声明临时表,则不能在另一个分支中单独声明它-无论控制流是否进入if
分支,它都“存在”
类似的论点也适用于变量
显然,选项a
仅在临时表结构相同时有效
如何忽略控制流的简单示例:
if 1=2
begin
declare @a int
end
set @a = 5
print @a
打印5
。只是:
set @a = 5
print @a
产生错误必须声明标量变量“@a”。
,这表明声明(在if
的未跟踪分支内)仍然有效。或者a)首先在存储过程中创建临时表,然后使用插入(…)选择…
填充它,或者b)为两个分支中的临时表使用不同的名称
T-SQL解析器是一个非常简单的beast,控制流不会影响其对哪些对象存在或不存在的解释-因此,如果在if
的一个分支中声明临时表,则不能在另一个分支中单独声明它-无论控制流是否进入if
分支,它都“存在”
类似的论点也适用于变量
显然,选项a
仅在临时表结构相同时有效
如何忽略控制流的简单示例:
if 1=2
begin
declare @a int
end
set @a = 5
print @a
打印5
。只是:
set @a = 5
print @a
产生错误
必须声明标量变量“@a”。
,这表明声明(在if
的未跟踪分支内)仍然有效。1。您需要使用两个不同的临时表,然后在SELECT*INTO语句之前删除它们
2.变量需要在主体过程中声明一次。在您之前的情况下,如果存在
CREATE PROCEDURE [dbo].[TestProc]
AS
SET NOCOUNT ON
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER OFF
DECLARE @region NVARCHAR(100)
IF EXISTS(SELECT 1 FROM dbo.test6)
BEGIN
IF OBJECT_ID('tempdb.dbo.#TempTable') IS NOT NULL DROP TABLE dbo.#TempTable
SELECT *
INTO #TempTable
FROM dbo.test6
END
ELSE
BEGIN
IF OBJECT_ID('tempdb.dbo.#TempTable2') IS NOT NULL DROP TABLE dbo.#TempTable2
SELECT *
INTO #TempTable2
FROM dbo.test6
END
1.您需要使用两个不同的临时表,然后在SELECT*INTO语句之前将其删除 2.变量需要在主体过程中声明一次。在您之前的情况下,如果存在
CREATE PROCEDURE [dbo].[TestProc]
AS
SET NOCOUNT ON
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER OFF
DECLARE @region NVARCHAR(100)
IF EXISTS(SELECT 1 FROM dbo.test6)
BEGIN
IF OBJECT_ID('tempdb.dbo.#TempTable') IS NOT NULL DROP TABLE dbo.#TempTable
SELECT *
INTO #TempTable
FROM dbo.test6
END
ELSE
BEGIN
IF OBJECT_ID('tempdb.dbo.#TempTable2') IS NOT NULL DROP TABLE dbo.#TempTable2
SELECT *
INTO #TempTable2
FROM dbo.test6
END