以下的代码中,是在存储过程中写的一个动态的视图,可是我的@sql变量组合的语句那些'组合的有问题,我也不知道哪里有问题,调试了半天,
暂时有两个问题
1. 直接执行下面的代码,存储过程生成不了,报错: 
服务器: 消息 170,级别 15,状态 1,过程 MonthSales,行 25
第 25 行: ') AND (A.DOC_DATE BETWEEN ' 附近有语法错误。
2.若把@sql变量里面的(B.HIERARCHY LIKE '|1|%') AND去掉,就可以生成存储过程,但是执行改存储过程时,会报错
 服务器: 消息 207,级别 16,状态 3,过程 MonthSales_view,行 1
列名 '春' 无效。
服务器: 消息 207,级别 16,状态 1,过程 MonthSales_view,行 1
列名 '夏' 无效。
服务器: 消息 207,级别 16,状态 1,过程 MonthSales_view,行 1
列名 '秋' 无效。
服务器: 消息 207,级别 16,状态 1,过程 MonthSales_view,行 1
列名 '冬' 无效。

请各位高手,帮我看看下面@sql变量的值到底改怎么写
create proc MonthSales(@stardate  datetime ,@overdate datetime)
as    declare @date1 nvarchar(8),@date2 nvarchar(8),@sql varchar(6000)
    SELECT @date1=CONVERT(varchar(100), @stardate, 112)
    SELECT   @date2=CONVERT(varchar(100), @overdate, 112)if exists (select * from dbo.sysobjects where id = object_id(N'MonthSales_view') and OBJECTPROPERTY(id, N'IsView') = 1)
begin
drop view MonthSales_view
end
 set @sql='CREATE VIEW MonthSales_view  as '+
           ' SELECT  P.UNIT_NUM AS UNIT_NUM,P.UNIT_NAME AS UNIT_NAME,datepart(year, A.DOC_DATE) AS year, datepart(month, A.DOC_DATE) AS MONTH, '+
          '  jijie=(case when datepart(month, A.DOC_DATE) between 1 and 3 then  '+ '春 '  + 
           ' when datepart(month, A.DOC_DATE) between 4 and 6 then ' +'夏 '   +
           ' when datepart(month, A.DOC_DATE) between 7 and 9 then  ' + '秋 '  + ' else ' + '冬 '  + 'end ) , '+ 
           ' SUM(K.SELL_QTY) AS SUM_SELL_QTY, SUM(K.SELL_VAL) AS SUM_SELL_VAL, '+
        ' COUNT(DISTINCT B.UNIT_NUM) AS DD, cast(SUM(K.SELL_QTY)/COUNT(DISTINCT B.UNIT_NUM) as decimal(10,0)) AS PP, '+ 
' cast(SUM(K.SELL_VAL)/COUNT(DISTINCT B.UNIT_NUM) as decimal(10,2)) AS JJ FROM RLB A '+
' INNER JOIN SYS_UNIT B ON (A.SHOP_ID = B.UNIT_ID) '+
 '  LEFT OUTER JOIN SYS_UNIT P ON (A.UNIT_ID = P.UNIT_ID) '+
'  LEFT OUTER JOIN RLB_DTL K ON (A.SHOP_ID = K.SHOP_ID AND A.RLB_NUM = K.RLB_NUM)'+
 ' WHERE  (B.HIERARCHY LIKE '|1|%') AND (A.DOC_DATE BETWEEN '+@date1+' AND '+@date2+' ) GROUP BY datepart(year, A.DOC_DATE),datepart(month, A.DOC_DATE),P.UNIT_NAME, P.UNIT_NUM  ' 
 
  exec(@sql)
if exists (select * from dbo.sysobjects where id = object_id(N'MonthSales_view') and OBJECTPROPERTY(id, N'IsView') = 1)
begin
select * from MonthSales_view
endgo 

解决方案 »

  1.   


      ' jijie=(case when datepart(month, A.DOC_DATE) between 1 and 3 then '+ '春 ' +  
      ' when datepart(month, A.DOC_DATE) between 4 and 6 then ' +'夏 ' +
      ' when datepart(month, A.DOC_DATE) between 7 and 9 then ' + '秋 ' + ' else ' + '冬 ' + 'end ) , '+ 改为试试: ' jijie=(case when datepart(month, A.DOC_DATE) between 1 and 3 then ''春 ''' +  
     ' when datepart(month, A.DOC_DATE) between 4 and 6 then ''夏 ''' +
     ' when datepart(month, A.DOC_DATE) between 7 and 9 then ''秋 ''' + ' else ''冬''end ) , ' +
      

  2.   

    那WHERE (B.HIERARCHY LIKE '|1|%') AND 这个该怎么写了,我写了好久,好似这个|符号有影响
      

  3.   

    改為:  B.HIERARCHY LIKE '|1|%')   這個錯誤很明顯!
    B.HIERARCHY LIKE '+''''+ '|1|%'+''''+') AND (A.DOC_DATE BETWEEN '+@date1+' AND '+@date2+' ) GROUP BY datepart(year, A.DOC_DATE),datepart(month, A.DOC_DATE),P.UNIT_NAME, P.UNIT_NUM '  
     
      

  4.   

    现在都OK了,但是在执行 exec  MonthSales '20100501','20110502' 的时候报错

    服务器: 消息 8115,级别 16,状态 2,过程 MonthSales,行 34
    将 expression 转换为数据类型 smalldatetime 时发生算术溢出错误。
      

  5.   

    ''''+@date1+''''+' AND '+''''+@date2+''''  这样行不行? 或者你 print @sql看下?