Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 选择ms sql查询if else块中的临时表_Sql Server - Fatal编程技术网

Sql server 选择ms sql查询if else块中的临时表

Sql server 选择ms sql查询if else块中的临时表,sql-server,Sql Server,我的情况是,我需要在特定的几个月内提取额外的项目列表。这是一个简化版本 我原以为可能是阻塞,所以我添加了BEGIN/END块,确保在代码的开始和结束处删除temp表。我有点困惑,为什么它似乎试图阅读其他部分中不适用的行 这是完整的示例代码 IF OBJECT_ID('tempdb..#TheTempTable') IS NOT NULL DROP TABLE #TheTempTable IF DATENAME(MONTH, GETDATE()) IN (N'March', N'April')

我的情况是,我需要在特定的几个月内提取额外的项目列表。这是一个简化版本

我原以为可能是阻塞,所以我添加了BEGIN/END块,确保在代码的开始和结束处删除temp表。我有点困惑,为什么它似乎试图阅读其他部分中不适用的行

这是完整的示例代码

IF OBJECT_ID('tempdb..#TheTempTable') IS NOT NULL DROP TABLE #TheTempTable

IF DATENAME(MONTH, GETDATE()) IN (N'March', N'April')

BEGIN
        SELECT PartNumber 
        INTO #TheTempTable  -- If I comment this out when May this block works
        FROM MainPartsTable
    UNION
        SELECT '999'
END
ELSE 
BEGIN
        SELECT PartNumber 
        INTO #TheTempTable --this works for March if this line is commmented out
        FROM MainPartsTable
END

SELECT * FROM #TheTempTable

IF OBJECT_ID('tempdb..#TheTempTable') IS NOT NULL DROP TABLE #TheTempTable
按原样运行时,我收到以下错误消息,抱怨在第二个块中插入了Taptable:

There is already an object named '#TheTempTable' in the database.
除非我在第二块注释掉这一行,否则它不会起作用

INTO #TheTempTable --this works for March when this line is commented out
如果我将月份改为5月份,则只有在第一个块中将注释掉后才能生效

IF DATENAME(MONTH, GETDATE()) IN (N'May', N'April')

谢谢大家!

这是一个解析器问题。您有两条语句试图在批处理中创建可清空的对象。这两条语句不能同时到达并不重要,解析器并没有那么聪明。这可以通过以下简单批处理进行复制:

如果1=1 在输入T时选择1 其他的 当I进入T时选择2; Msg 2714,16级,状态1,第4行 数据库中已存在名为“T”的对象

而是在IF语句之外创建表,然后插入:

如果存在可删除的表,则删除该表 选择零件号 进入可拆卸状态 来自MainPartsTable 其中1=0-不可能是真的 如果是DATENAMEMONTH,则获取N'March'和N'April'中的日期 开始 插入可拆卸的零件号 选择零件号 来自MainPartsTable 联盟——所有? 选择"999";; 终止 其他的 开始 插入可拆卸的零件号 选择零件号 来自MainPartsTable 终止 从可选项中选择*; 如果存在可清空的表格,则删除该表格; 当然,整个过程可以简化为以下内容:

选择零件号 进入可拆卸状态 从选择零件号 来自MainPartsTable 联合所有 选择“999” 其中DATEPARTMONTH,GETDATE为3,4PN-语言不可知论者
注意Larnu如何使用UNION ALL而不是UNION?了解显著差异。还请注意,使用DATEPART MONTH是一个较短的等价项,以避免对语言的依赖。最后,你真的需要临时表吗?这种类型的模式通常是过度或低效的。它可以是@SMor,但这并不意味着它会是。这取决于它的用例。尽管对于我们这里的简单化查询,我同意它不太可能对性能有好处。@Larnu,这就是我有条件地使用它的原因。这不是一个绝对的说法,但从这里发布的问题来看,这是一个相当普遍的问题。盲目地使用一种模式——任何模式——都不是一个好习惯。谢谢你的回答,我刚刚意识到我需要插入钻头。感谢您对简化版的建议。我会调查的!再次感谢你!