1

我想做一个检查(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.
4

2 回答 2

1

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

T-SQL 解析器是一个非常简单的野兽,控制流不会影响它对哪些对象存在或不存在的解释——所以如果你在一个分支中声明一个临时表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".,这表明声明(在未遵循的分支内if)仍然有效。

于 2013-01-03T08:28:18.163 回答
0

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

2.变量需要在body过程中声明一次。在您的情况下,如果存在之前

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
于 2013-01-03T15:48:57.420 回答