2012-02-09 95 views
2

我真的很困惑这个!我相信这很简单,但真的不知道!T-SQL IF语句解释

DECLARE @jobid INT = 100 
    IF (@JobID >= 0) 
BEGIN 
SELECT * into #tmp FROM Persons 
end 
    ELSE 
BEGIN 
SELECT * into #tmp FROM Persons1 
end 

它给出了#tmp表已经存在的错误!为什么它会验证这两个陈述!

当然,我的原始查询是巨大的,做得更多,但这是一个示例来说明我的错误。

有人可以解释一下吗?

#tmp表不存在,即使您尝试删除它或更改名称,引擎仍然会验证这两个语句!

我正在使用2008 R2。

感谢 杰森

+6

,因为你还没有降到' #tmp'来自上一次运行? – 2012-02-09 21:20:06

+0

我很肯定你在'ELSE'之后不需要'BEGIN'。另外,根据MSDN ELSE需要在END之后出现吗? http://msdn.microsoft.com/en-us/library/ms182717.aspx – 2012-02-09 21:23:09

+0

@ p.campbell - 不,那不是它。如果您尝试了代码,您会注意到它是引发错误而不是运行时的解析器。它们之间的错误信息几乎相同。解析器错误会给你'Msg 2714,Level 16,State 1',运行时错误会给你'Msg 2714,Level 16,State 6'。 – 2012-02-10 07:00:28

回答

2

您在链接的服务器上运行呢? 你没有删除之前运行的那个。

尝试创建#tmp前表IF声明:

CREATE TABLE #tmp(fields...) 

DECLARE @jobid INT = 100 
IF (@JobID >= 0) 
BEGIN 
    INSERT #tmp 
    SELECT * FROM Persons 
end 
ELSE 
BEGIN 
    INSERT #Tmp 
    SELECT * FROM Persons1 
end 

从查询以前运行删除页首页上页一个

IF OBJECT_ID('tempdb..#tmp') IS NOT NULL 
    EXEC('DROP TABLE #tmp') 
GO 

DECLARE @jobid INT = 100 
    IF (@JobID >= 0) 
BEGIN 
SELECT * into #tmp FROM Persons 
end 
    ELSE 
BEGIN 
SELECT * into #tmp FROM Persons1 
end 
+0

感谢Oleg,不,它不是链接服务器,只是本地,但表不存在,我试图理解它为什么扔即使有IF OBJECT_ID('#tmp')IS NOT NULL DROP TABLE #tmp GO – JYousef 2012-02-09 21:29:24

+0

因此,在if之前创建它,并查看更新的第二条语句 – 2012-02-09 21:32:52

+1

您需要检查IF IF OBJECT_ID('tempDB。 。#tmp')不是@diaho写的。 – 2012-02-09 21:36:56

2

#tmp可能已经创造了tempDB。如果你不使用#tmp随时随地在你询问之前,该块,你可以不喜欢以下之前的代码块,以确保它总是蓄势待发:

IF OBJECT_ID('tempDB..#tmp') IS NOT NULL 
    DROP TABLE #tmp 
+0

感谢您的回复......但是请相信与否,它不在那里....尝试任何其他名字,仍然给出相同的错误! – JYousef 2012-02-09 21:26:59

+0

你是对的@JYousef。 Google搜索错误(消息2714,级别16 ...数据库中已有一个名为'#tmp'的对象)显示临时表存在限制。“Persons”和“Persons1”的模式是相同的吗?如果是这样,我会推荐@Oleg推荐的第一个解决方案。 – diaho 2012-02-09 21:47:12

+0

谢谢,是的,我正在使用第一种方式像@ Oleg推荐,但我很困惑,为什么它会验证并给出该错误!感谢你的帮助。 – JYousef 2012-02-09 21:52:45