我遇到一些奇怪的问题,使用IF / ELSE来确定要执行哪一个或两个SELECT语句。我在运行完整语句时得到的错误消息是我的临时表已经存在,但如果我运行两个单独的IF语句的两个单独执行,则不会发生这种情况。
以下是SQL Server中的代码:
IF (select BusinessDayCount from Calendartbl) <= 1
BEGIN
SELECT * into #temp1
FROM PreviousMonthTbl
END
ELSE
BEGIN
SELECT * into #temp1
FROM CurrentMonthTbl
END
答案 0 :(得分:12)
这是SQL Server中语法检查的“功能”。您根本无法在同一批次中“创建”两次#temporary表。
这是你需要的模式。
SELECT * into #temp1
FROM PreviousMonthTbl
WHERE 1=0;
IF (select BusinessDayCount from Calendartbl) <= 1
BEGIN
INSERT into #temp1 SELECT *
FROM PreviousMonthTbl
END
ELSE
BEGIN
INSERT into #temp1 SELECT *
FROM CurrentMonthTbl
END
如果您愿意,还可以将分支(在本例中)表示为WHERE子句:
SELECT * into #temp1
FROM PreviousMonthTbl
WHERE (select BusinessDayCount from Calendartbl) <= 1
UNION ALL
SELECT *
FROM CurrentMonthTbl
WHERE isnull((select BusinessDayCount from Calendartbl),2) > 1
答案 1 :(得分:1)
对于同一批次中具有相同名称的表,不能使用SELECT INTO。为临时表使用不同的名称
IF EXISTS(
SELECT 1
FROM Calendartbl
WHERE BusinessDayCount <= 1
)
BEGIN
IF OBJECT_ID('tempdb.dbo.#PreviousMonthTbl') IS NULL DROP TABLE dbo.#PreviousMonthTbl
SELECT *
INTO #PreviousMonthTbl
FROM PreviousMonthTbl
END
ELSE
BEGIN
IF OBJECT_ID('tempdb.dbo.#CurrentMonthTbl') IS NULL DROP TABLE dbo.#CurrentMonthTbl
SELECT *
INTO #CurrentMonthTbl
FROM CurrentMonthTbl
END
答案 2 :(得分:0)
据我所知,问题是:
当您运行以下语句时,
SELECT * into #temp1 FROM CurrentMonthTbl
您正在动态创建临时表。
如果在该行之前有一个create table语句,那么这个Select into语句将失败,因为该表已经存在。
如果您已经创建了临时表,请尝试替换:
SELECT * into #temp1 FROM CurrentMonthTbl
使用:
Insert into #temp1
Select * from CurrentMonthTbl
另请参阅There is already an object named '##Temp' in the database