以下的代码中,是在存储过程中写的一个动态的视图,可是我的@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. 直接执行下面的代码,存储过程生成不了,报错:
服务器: 消息 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
' 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 ) , ' +
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 '
服务器: 消息 8115,级别 16,状态 2,过程 MonthSales,行 34
将 expression 转换为数据类型 smalldatetime 时发生算术溢出错误。