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