首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

储存过程执行出现的有关问题

2013-06-19 
储存过程执行出现的问题代码如下:ALTER Procedure [dbo].[ShipDateQtyPush_Plan]@SVarchar(10),@FVarchar(

储存过程执行出现的问题
代码如下:


ALTER Procedure [dbo].[ShipDateQtyPush_Plan]
@SVarchar(10),
@FVarchar(10),
@FnSamVarchar(15),
@FnQtyVarchar(15),@GradeFloat
As
Create Table #a
(
POVarchar(20),
SeasonVarchar(10),
StyleVarchar(20),
ShipDateVarchar(10),
CustomerVarchar(10),
ColorVarchar(50),
QtyInt,
CuttingQtyInt,
Qty226Int,
SamFloat,
ActQtyInt,
DiffQtyInt
)
Declare @strVarchar(8000)
Set @str='Insert into #a
Select 
PO,Season,Style,Convert(Varchar(10),ShipDate,120) ShipDate,Customer,Color, 
Sum(Qty) Qty,Sum(CuttingQty) CuttingQty,Sum(Qty226) Qty226,'+@FnSam+' Sam, 
Sum('+@FnQty+') ActQty,Sum(Qty-'+@FnQty+') DiffQty
from 
ShipDateQtyPush 
where  
ShipDate>='''+@S+''' and ShipDate<='''+@F+'''
Group by
PO,Season,Style,ShipDate,Customer,Color,Sam331'
Exec(@str)
--------------------------------------------------------------------
declare @sql varchar(8000)
set @sql='select PO,Season,Style,Customer,ShipDate,Color,Qty,CuttingQty,Qty226,Round(Sam,2) Sam,ActQty'
select @sql=@sql+',['+dd+'ろ计]=sum(case Convert(Varchar(10),ShipDate,120) when '''+dd+''' then DiffQty else 0 end)'
+',['+dd+'惠]=sum(case Convert(Varchar(10),ShipDate,120) when '''+dd+''' then Round((Qty-ActQty)*(Sam'+@Grade+')/60,2) else 0 end)'
from (select distinct dd=Convert(Varchar(10),ShipDate,120) from #a) ss
set @sql=@sql+'  from #a group by PO,Season,Style,Customer,ShipDate,Color,Qty,CuttingQty,Qty226,Sam,ActQty'
exec(@sql)
Drop table #a

执行:
ShipDateQtyPush_Plan 
'2013-06-13',
'2013-06-22',
'Sam331',
'Qty331',
1
然后提示

(58 row(s) affected)
Msg 8114, Level 16, State 5, Procedure ShipDateQtyPush_Plan, Line 38
Error converting data type varchar to float.
我就是加了@Grade这个变量之后出错的,想请问该怎么做?
[解决办法]
可以先把@sql打印出来后到查询分析器中检查语法有没有错误了
[解决办法]
--需要转@Grade为文本才能添加在@sql中

declare @sql varchar(8000)
set @sql='select PO,Season,Style,Customer,ShipDate,Color,Qty,CuttingQty,Qty226,Round(Sam,2) Sam,ActQty'
select @sql=@sql+',['+dd+'ろ计]=sum(case Convert(Varchar(10),ShipDate,120) when '''+dd+''' then DiffQty else 0 end)'
+',['+dd+'惠]=sum(case Convert(Varchar(10),ShipDate,120) when '''+dd+''' then Round((Qty-ActQty)*(Sam'+convert(varchar,@Grade)+')/60,2) else 0 end)' ----这里
from (select distinct dd=Convert(Varchar(10),ShipDate,120) from #a) ss
set @sql=@sql+'  from #a group by PO,Season,Style,Customer,ShipDate,Color,Qty,CuttingQty,Qty226,Sam,ActQty'


exec(@sql)
Drop table #a


[解决办法]
原因找到了是因为 @Grade 为Float类型的,不能直接与字符串连接的,须转换一下了
[解决办法]
改成这样试试:

(Sam'''+CAST(@Grade AS VARCHAR)+''')

[解决办法]
print @sql --在exec(@sql)之前把@SQL打印出来
exec(@sql)

估计是这个里的问题了:Round((Qty-ActQty)*(Sam'+@Grade+')/60,2)
若@Grade=1.50的话,你是想这样吗?
Round((Qty-ActQty)*(Sam+1.50)/60,2)
若是,则:
select @sql=@sql+',['+dd+'ろ计]=sum(case Convert(Varchar(10),ShipDate,120) when '''+dd+''' then DiffQty else 0 end)'
+',['+dd+'惠]=sum(case Convert(Varchar(10),ShipDate,120) when '''+dd+''' then Round((Qty-ActQty)*(Sam+'+cast(@Grade as varchar(10))+')/60,2) else 0 end)'
from (select distinct dd=Convert(Varchar(10),ShipDate,120) from #a) ss

热点排行