存储过程的参数问题 先判断参数的类型,你写的那个不是datetime类型,用encodedate()函数 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我有一个存储过程,参数是datetime类型的,参数不要用datetime类型,直接用varchar类型。省了转换。execute prc_name '2002-01-02 00:00' 我的存储过程如下:CREATE proc prc_zwcl_cs @shijian datetimeas set nocount ondeclare @buildsql nvarchar(4000), @name varchar(9)-- create new tableselect @name=year(@shijian)if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[t_zj_' + @name + ']') and OBJECTPROPERTY(id, N'IsUserTable') = 1)goto calculateelsebeginselect @buildsql=N'CREATE TABLE [dbo].[t_zj_' + @name +'] ( [lsh] [numeric](18, 0) IDENTITY (1, 1) NOT NULL , [period] [datetime] NOT NULL , [kpbh] [numeric](18, 0) NOT NULL , [gdzcbh] [char] (11) COLLATE Chinese_PRC_CI_AS NOT NULL , [gdzcmc] [char] (40) COLLATE Chinese_PRC_CI_AS NULL , [yz] [numeric](18, 0) NULL , [byzj] [numeric](18, 0) NULL , [ljzj] [numeric](18, 0) NULL , [jcz] [numeric](18, 0) NULL , [zjl] [numeric](18, 0) NULL ) ON [PRIMARY]'execute sp_executesql @buildsqlgoto calculateendcalculate:update t_gdzc_main set yzjl=(1-jczl)/(synx*12), yzje = 0 update t_gdzc_main set yzjl=(1-jczl)/(synx*12), yzje= yz*(1-jczl)/(synx*12), ljzj=ljzj + yz*(1-jczl)/(synx*12), jz=yz-ljzj, jcz=yz*jczl, ytzjyf=ytzjyf + 1 where (year(kssyrq)<year(@shijian) or (year(kssyrq)=year(@shijian) and month(kssyrq)< month(@shijian) ) ) and ( (act_time is null ) or year(act_time)>year(@shijian) or (year(act_time)=year(@shijian) and month(act_time)>month(@shijian) ) );select @buildsql=N'insert into t_zj_'+ @name+'(period,kpbh,gdzcbh,gdzcmc,yz,byzj,ljzj,jcz,zjl)select '+@shijian+',kpbh,gdzcbh,gdzcmc,yz,yzje,ljzj,jcz,yzjl from t_gdzc_main where yzje>0'execute sp_executesql @buildsqlGO declare @date datetimeset @date=convert(datetime,'2002-01-02')execute prc_name @date cast('2002-01-02 00:00' as datetime) 建议参数不要用datetime类型,用varchar类型。 LoveSQL(ligg) 你说的是在sql中,我用到pb中就不能用了,提示我类型出错。 --不需要使用convert,去掉就行了.数据类型会自动转换的.execute prc_name '2002-01-02 00:00' 不要使用转还,sql会对第一次使用的数据自动转换 execute prc_name convert(datetime,'2002-01-02 00:00',20)20是按照中国的习惯取值方法。 不是“不需要使用convert转换”,而是不能这样使用。 因为你在调用时,输入的参数如果是一个计算表达式,不是常量的话,是在前台的语言中进行计算的,也就是说,如果你前台用的VB,那么convert(datetime,'2002-01-02 00:00')这个计算式要在VB中进行计算,而VB是没有convert函数的,所以会出错。 传日期到sql中,还是使用 varchar类型比较好处理 ,在需要时,sql中可以随时进行转换。 SQLSERVER会隐式进行字符到日期的转换,只要你输入的字符串式符合日期的格式。 全文索引问题,急寻高手指点!!! 这个查询语句怎么写? sql按1.1,1.1.1,1.1.2,1.1.3,1.2,1.3排序 存储过程内字符串的问题 急 image类型的xml文件如何分析? 40分求解一sql 在线等 sql问题 大神速度来 困扰我太久了 救救我 关于统计数据 对IGNORE_DUP_KEY熟悉的进来,在线等急! 我想存储’这个字符怎么写SQL语句? 服务器未能装载 DCOM,运行了一个Retrieving and Writing XML Data的存储过程出错 关于数据更新、备份的问题
参数不要用datetime类型,直接用varchar类型。省了转换。
execute prc_name '2002-01-02 00:00'
CREATE proc prc_zwcl_cs
@shijian datetime
as
set nocount ondeclare @buildsql nvarchar(4000),
@name varchar(9)-- create new table
select @name=year(@shijian)
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[t_zj_' + @name + ']') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
goto calculate
else
begin
select @buildsql=N'CREATE TABLE [dbo].[t_zj_' + @name +'] (
[lsh] [numeric](18, 0) IDENTITY (1, 1) NOT NULL ,
[period] [datetime] NOT NULL ,
[kpbh] [numeric](18, 0) NOT NULL ,
[gdzcbh] [char] (11) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[gdzcmc] [char] (40) COLLATE Chinese_PRC_CI_AS NULL ,
[yz] [numeric](18, 0) NULL ,
[byzj] [numeric](18, 0) NULL ,
[ljzj] [numeric](18, 0) NULL ,
[jcz] [numeric](18, 0) NULL ,
[zjl] [numeric](18, 0) NULL
) ON [PRIMARY]'
execute sp_executesql @buildsql
goto calculate
endcalculate:
update t_gdzc_main
set yzjl=(1-jczl)/(synx*12),
yzje = 0
update t_gdzc_main
set yzjl=(1-jczl)/(synx*12),
yzje= yz*(1-jczl)/(synx*12),
ljzj=ljzj + yz*(1-jczl)/(synx*12),
jz=yz-ljzj,
jcz=yz*jczl,
ytzjyf=ytzjyf + 1
where (year(kssyrq)<year(@shijian) or
(year(kssyrq)=year(@shijian) and month(kssyrq)< month(@shijian) ) )
and ( (act_time is null ) or year(act_time)>year(@shijian) or
(year(act_time)=year(@shijian) and month(act_time)>month(@shijian) ) );
select @buildsql=N'insert into t_zj_'+ @name+'(period,kpbh,gdzcbh,gdzcmc,yz,byzj,ljzj,jcz,zjl)
select '+@shijian+',kpbh,gdzcbh,gdzcmc,yz,yzje,ljzj,jcz,yzjl from t_gdzc_main
where yzje>0'execute sp_executesql @buildsql
GO
set @date=convert(datetime,'2002-01-02')
execute prc_name @date
不是“不需要使用convert转换”,而是不能这样使用。 因为你在调用时,输入的参数如果是一个计算表达式,不是常量的话,是在前台的语言中进行计算的,也就是说,如果你前台用的VB,那么convert(datetime,'2002-01-02 00:00')这个计算式要在VB中进行计算,而VB是没有convert函数的,所以会出错。