日期:2014-05-18  浏览次数:20568 次

存储过程 insert 时日期类型出错
当@B_indate ,@B_outdate插进去时数据总是1905年的。月份和日都没什么规律。请叫高手。
create procedure memberbook
@R_id varchar(20) , --客房类型
@bo_amount int, --订房数量
@M_id Varchar(20) , --会员号
@B_indate datetime , --预计入住时间
@B_outdate datetime --离开时间
as
declare @aa varchar(200)
set @aa='insert into Bookin values('''+@R_id+''','+ rtrim(@bo_amount)+','''+ @M_id+''','+convert(varchar(10),@B_indate,20)+','+ convert(varchar(10),@B_outdate,20)+')' exec(@aa)
--exec sp_executesql @aa,N'@cc int output',@cc output
go


------解决方案--------------------
SQL code
1,首先,这种语句没必要用动态语句,因为你的表名和列名不是未知的.

INSERT INTO Bookin VALUES @R_id,@bo_amount,@m_id,....

2,你出错的原因在于:

,'+convert(varchar(10),@B_indate,20)+','+ convert(varchar(10),@B_outdate,20)+')
这句里面,日期量没有进行定界.
相当于你语句里执行的:
INSERT INTO ... VALUSE ,....,2008-1-1,2008-2-1

看下面就明白了.
DECLARE @d DATETIME
SET @d=2008-7-1   --这里进行了数学运算,得到 2000, SET @d=2000 ,即以1900-1-1开始,以天为单位加上2000天,当然得到1905年了.
SELECT @d


也请参见
http://topic.csdn.net/u/20071210/22/bc50a527-58cc-42e0-849b-5457d1fb68f0.html

------解决方案--------------------
探讨
create procedure memberbook
@R_id varchar(20) , --客房类型
@bo_amount int, --订房数量
@M_id Varchar(20) , --会员号
@B_indate datetime , --预计入住时间
@B_outdate datetime --离开时间
as
insert into Bookin values @R_id,@bo_amount,@M_id,@B_indate,@B_outdate
go

会报错。第 8 行: '@R_id' 附近有语法错误。