Sql 在一个脚本中创建两个可能的存储过程之一

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语句),然后创建两个可能的过程之一

现在我正在尝试在
创建过程
语句中使用
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