none
SQL语法检测器问题 RRS feed

  • 问题




  • CREATE PROCEDURE [dbo].[usp_sendr]
    AS
        BEGIN


    --周一
            SET datefirst 1  
            IF ( DATEPART(DW, GETDATE()) = '1' )
                BEGIN


                    SELECT TOP 10
                            l.DealTime AS StorageOutTime
                    INTO    [tempdb].[##tt6]
                    FROM    [store_xinye].[dbo].[SpecialItem] s
                            JOIN [store_xinye].[dbo].[SpecialLine] l ON l.Id = s.OrderID
                            JOIN [store_xinye].[dbo].Crm_Client c ON c.ClientId = s.ClientId
                    WHERE   l.DealFlag = 3
                    

                    SELECT TOP 10
                            [Volume] ,
                            [PricingExpressProductCode]
                    INTO    [tempdb].[##tt7]
                    FROM    [store_xinye].[dbo].[OrderOutProduct] oop
                            JOIN [store_xinye].[dbo].[OrderOut] oo ON oo.Id = oop.OrderOut
                            JOIN [store_xinye].[dbo].[Crm_Client] c ON c.ClientId = oo.Client
                    WHERE   Package = 0
        

                    SELECT  s.[ScmSign] ,
                            s.IsPay
                    INTO    [tempdb].[##tt8]
                    FROM    [store_xinye].[dbo].[Scm_ProductIn] s
                            JOIN [store_xinye].[dbo].[Logistics] l ON s.[LogisticsID] = l.ID
                    WHERE   l.[SailingTime] > DATEADD(DAY, -7, GETDATE())
        

                END
          






    --每月1号
            IF ( DATEPART(DAY, GETDATE()) = 1 )
    BEGIN
                
                    SELECT TOP 10
                            l.DealTime AS StorageOutTime
                    INTO    [tempdb].[##tt6]
                    FROM    [store_xinye].[dbo].[SpecialItem] s
                            JOIN [store_xinye].[dbo].[SpecialLine] l ON l.Id = s.OrderID
                            JOIN [store_xinye].[dbo].Crm_Client c ON c.ClientId = s.ClientId
                    WHERE   l.DealFlag = 3
       

                    SELECT TOP 10
                            [PricingExpressProductCode]
                    INTO    [tempdb].[##tt7]
                    FROM    [store_xinye].[dbo].[OrderOutProduct] oop
                            JOIN [store_xinye].[dbo].[OrderOut] oo ON oo.Id = oop.OrderOut
                            JOIN [store_xinye].[dbo].[Crm_Client] c ON c.ClientId = oo.Client
                    WHERE   Package = 


                    SELECT  TOP 10
                           s.IsPay
                    INTO    [tempdb].[##tt8]
                    FROM    [store_xinye].[dbo].[Scm_ProductIn] s
                            JOIN [store_xinye].[dbo].[Logistics] l ON s.[LogisticsID] = l.ID


                END


        END


    消息 2714,级别 16,状态 1,过程 usp_sendr,第 57 行
    数据库中已存在名为 '##tt6' 的对象。
    消息 2714,级别 16,状态 1,过程 usp_sendr,第 66 行
    数据库中已存在名为 '##tt7' 的对象。
    消息 2714,级别 16,状态 1,过程 usp_sendr,第 75 行
    数据库中已存在名为 '##tt8' 的对象。

    Love SQL

    2016年3月1日 3:22

答案

  • 这个问题一直存在的,应该是语法检查的时候不分析处理逻辑,所以里面有相同的 select into 的时候会报错(没到执行阶段)

    可以简化一下这个问题的示例语句,如下,语法检查是通不过的,从逻辑上讲,select into 之前已经删除了,应该不报错,但语法检查这步是过不了的(当然,语法检查过不了也就肯定不能执行)

    if 1=1
    begin;
    	drop table #t
    	select id=1 into #t
    end;
    else 
    begin;
    	drop table #t
    	select id=1 into #t
    end;

    2016年3月1日 5:34

全部回复

  • Statement 'select ... into ... from ...' will create table, looks like those global temp tables exist already.
    2016年3月1日 4:18
  • 创建这个存储过程之前我已经

    drop table [tempdb].[##tt6]

    drop table [tempdb].[##tt7]

    drop table [tempdb].[##tt8]


    Love SQL

    2016年3月1日 4:42
  • 这个问题一直存在的,应该是语法检查的时候不分析处理逻辑,所以里面有相同的 select into 的时候会报错(没到执行阶段)

    可以简化一下这个问题的示例语句,如下,语法检查是通不过的,从逻辑上讲,select into 之前已经删除了,应该不报错,但语法检查这步是过不了的(当然,语法检查过不了也就肯定不能执行)

    if 1=1
    begin;
    	drop table #t
    	select id=1 into #t
    end;
    else 
    begin;
    	drop table #t
    	select id=1 into #t
    end;

    2016年3月1日 5:34
  • 可以考虑分开写存储过程,或者用 exec 隔离下
    2016年3月1日 5:35
  • 好吧                                   

    Love SQL

    2016年3月1日 6:33