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

时间:2013-01-03 08:11:52

标签: sql sql-server-2008 stored-procedures proc

我想做一个检查(if语句),然后创建两个可能的过程之一。

现在我正在尝试在IF EXISTS语句中使用CREATE PROCEDURE语句。

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

...用#TempTable等做点什么..

DROP #TempTable
END

ELSE
BEGIN
DECLARE @region NVARCHAR(100)

SELECT *
INTO #TempTable
FROM User

...用#TempTable等做其他事情

DROP #TempTable
END

我收到以下2个错误

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.

2 个答案:

答案 0 :(得分:1)

a)首先在存储过程中创建临时表,然后使用INSERT INTO (...) SELECT ...填充它,或者b)在两个分支中为临时表使用不同的名称。

T-SQL解析器是一个非常简单的野兽,控制流不影响它对哪些对象存在与否的解释 - 所以如果你在{的一个分支中声明一个临时表{1}},你不能在另一个分支中单独声明它 - 它是否“存在”控制流是否进入IF分支。

类似的参数适用于变量。

显然,只有临时表结构相同时,选项IF才有效。


忽略控制流的简单示例:

a

打印if 1=2 begin declare @a int end set @a = 5 print @a 。只是:

5

产生错误set @a = 5 print @a ,这表明声明(在Must declare the scalar variable "@a".的未跟随分支内)仍然生效。

答案 1 :(得分:0)

1.您需要使用两个不同的临时表,然后在SELECT * INTO语句之前删除它们

2.在身体手术中宣布的可变性需求。在您的情况下,在IF EXISTS之前

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