存储过程中动态SQL中的传入参数为datetime类型的问题
如题,我创建了一个存储过程,使用的是动态语句,具体如下:createprocedurebaobiao1@date1datetime,date2datetimeassetn...
如题,我创建了一个存储过程,使用的是动态语句,具体如下:
create procedure baobiao1 @date1 datetime ,date2 datetime as
set nocount on
begin
Set XACT_ABORT ON;
Begin Tran
Declare @SQL1 varchar(8000)
Declare @SQL2 varchar(8000)
--Set @SQL='Create view A as select ....'
--Exec(@SQL)
if exists (SELECT * FROM sysobjects WHERE name = 'report1')
drop view report1
set @SQL1='create view report1 as select s.englishName,s.belongzu,count(*) kaitai,
jiachan=(case s.shiftName when ''甲'' then sum(s.realproduc) else 0 end),
jiachaochan=(case s.shiftName when ''甲'' then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
yichan=(case s.shiftName when ''乙'' then sum(s.realproduc) else 0 end),
yichaochan=(case s.shiftName when ''乙'' then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
bingchan=(case s.shiftName when''丙''then sum(s.realproduc) else 0 end),
bingchaochan=(case s.shiftName when''丙''then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
dingchan=(case s.shiftName when''丁''then sum(s.realproduc) else 0 end),
dingchaochan=(case s.shiftName when''丁''then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
(case when s.shiftName =''甲''then sum(p.cibushu) else 0 end) jiacibu,
(case when s.shiftName =''乙''then sum(p.cibushu) else 0 end) yicibu,
(case when s.shiftName =''丙''then sum(p.cibushu) else 0 end) bingcibu,
(case when s.shiftName =''丁''then sum(p.cibushu) else 0 end) dingcibu,
(case when s.shiftName =''甲''then sum(p.kaijianshu) else 0 end) jiakaijian,
(case when s.shiftName =''乙''then sum(p.kaijianshu) else 0 end) yikaijian,
(case when s.shiftName =''丙''then sum(p.kaijianshu) else 0 end) bingkaijian,
(case when s.shiftName =''丁''then sum(p.kaijianshu) else 0 end) dingkaijian
from HistoryPro1 s left outer join kaijianjicibu2 p on s.wholeDate = p.wholeDate AND
s.MachineID = p.MachineID AND
s.shiftName = p.shiftName where s.wholeDate >=@date1 and s.wholeDate <=@date2 group by s.englishName,s.belongzu,s.shiftName'
exec(@SQL1)
commit Tran
end
set nocount on
GO
在查询分析器中执行出现下面错误:
服务器: 消息 208,级别 16,状态 1,过程 report2,行 1
对象名 'report1' 无效。
服务器: 消息 208,级别 16,状态 1,过程 baobiao1,行 47
对象名 'report2' 无效。
服务器: 消息 208,级别 16,状态 1,过程 baobiao1,行 47
对象名 'report2' 无效。
服务器: 消息 208,级别 16,状态 1,过程 baobiao1,行 47
对象名 'report2' 无效。
服务器: 消息 266,级别 16,状态 1,过程 baobiao1,行 58
EXECUTE 后的事务计数指出缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。原计数 = 0,当前计数 = 1。
服务器: 消息 137,级别 15,状态 1,过程 report1,行 20
必须声明变量 '@date1'。
请大侠指点啊,具体应该怎么修改,出错在什么地方,谢谢
补充一下,下面那个是set nocount off,写错了,不好意思啊 展开
create procedure baobiao1 @date1 datetime ,date2 datetime as
set nocount on
begin
Set XACT_ABORT ON;
Begin Tran
Declare @SQL1 varchar(8000)
Declare @SQL2 varchar(8000)
--Set @SQL='Create view A as select ....'
--Exec(@SQL)
if exists (SELECT * FROM sysobjects WHERE name = 'report1')
drop view report1
set @SQL1='create view report1 as select s.englishName,s.belongzu,count(*) kaitai,
jiachan=(case s.shiftName when ''甲'' then sum(s.realproduc) else 0 end),
jiachaochan=(case s.shiftName when ''甲'' then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
yichan=(case s.shiftName when ''乙'' then sum(s.realproduc) else 0 end),
yichaochan=(case s.shiftName when ''乙'' then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
bingchan=(case s.shiftName when''丙''then sum(s.realproduc) else 0 end),
bingchaochan=(case s.shiftName when''丙''then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
dingchan=(case s.shiftName when''丁''then sum(s.realproduc) else 0 end),
dingchaochan=(case s.shiftName when''丁''then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
(case when s.shiftName =''甲''then sum(p.cibushu) else 0 end) jiacibu,
(case when s.shiftName =''乙''then sum(p.cibushu) else 0 end) yicibu,
(case when s.shiftName =''丙''then sum(p.cibushu) else 0 end) bingcibu,
(case when s.shiftName =''丁''then sum(p.cibushu) else 0 end) dingcibu,
(case when s.shiftName =''甲''then sum(p.kaijianshu) else 0 end) jiakaijian,
(case when s.shiftName =''乙''then sum(p.kaijianshu) else 0 end) yikaijian,
(case when s.shiftName =''丙''then sum(p.kaijianshu) else 0 end) bingkaijian,
(case when s.shiftName =''丁''then sum(p.kaijianshu) else 0 end) dingkaijian
from HistoryPro1 s left outer join kaijianjicibu2 p on s.wholeDate = p.wholeDate AND
s.MachineID = p.MachineID AND
s.shiftName = p.shiftName where s.wholeDate >=@date1 and s.wholeDate <=@date2 group by s.englishName,s.belongzu,s.shiftName'
exec(@SQL1)
commit Tran
end
set nocount on
GO
在查询分析器中执行出现下面错误:
服务器: 消息 208,级别 16,状态 1,过程 report2,行 1
对象名 'report1' 无效。
服务器: 消息 208,级别 16,状态 1,过程 baobiao1,行 47
对象名 'report2' 无效。
服务器: 消息 208,级别 16,状态 1,过程 baobiao1,行 47
对象名 'report2' 无效。
服务器: 消息 208,级别 16,状态 1,过程 baobiao1,行 47
对象名 'report2' 无效。
服务器: 消息 266,级别 16,状态 1,过程 baobiao1,行 58
EXECUTE 后的事务计数指出缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。原计数 = 0,当前计数 = 1。
服务器: 消息 137,级别 15,状态 1,过程 report1,行 20
必须声明变量 '@date1'。
请大侠指点啊,具体应该怎么修改,出错在什么地方,谢谢
补充一下,下面那个是set nocount off,写错了,不好意思啊 展开
3个回答
展开全部
你先调试一下,少了个@和begin、end
另外,拼接变量不能在字符串内啊,这样没用
create procedure [dbo].[baobiao1]
@date1 datetime,
@date2 datetime
as
set nocount on
begin
Set XACT_ABORT ON;
Begin Tran
Declare @SQL1 varchar(8000)
Declare @SQL2 varchar(8000)
--Set @SQL='Create view A as select ....'
--Exec(@SQL)
if exists (SELECT * FROM sysobjects WHERE name = 'report1')
begin
drop view report1
end
set @SQL1='create view report1 as select s.englishName,s.belongzu,count(*) kaitai,
jiachan=(case s.shiftName when ''甲'' then sum(s.realproduc) else 0 end),
jiachaochan=(case s.shiftName when ''甲'' then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
yichan=(case s.shiftName when ''乙'' then sum(s.realproduc) else 0 end),
yichaochan=(case s.shiftName when ''乙'' then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
bingchan=(case s.shiftName when''丙''then sum(s.realproduc) else 0 end),
bingchaochan=(case s.shiftName when''丙''then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
dingchan=(case s.shiftName when''丁''then sum(s.realproduc) else 0 end),
dingchaochan=(case s.shiftName when''丁''then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
(case when s.shiftName =''甲''then sum(p.cibushu) else 0 end) jiacibu,
(case when s.shiftName =''乙''then sum(p.cibushu) else 0 end) yicibu,
(case when s.shiftName =''丙''then sum(p.cibushu) else 0 end) bingcibu,
(case when s.shiftName =''丁''then sum(p.cibushu) else 0 end) dingcibu,
(case when s.shiftName =''甲''then sum(p.kaijianshu) else 0 end) jiakaijian,
(case when s.shiftName =''乙''then sum(p.kaijianshu) else 0 end) yikaijian,
(case when s.shiftName =''丙''then sum(p.kaijianshu) else 0 end) bingkaijian,
(case when s.shiftName =''丁''then sum(p.kaijianshu) else 0 end) dingkaijian
from HistoryPro1 s left outer join kaijianjicibu2 p on s.wholeDate = p.wholeDate AND
s.MachineID = p.MachineID AND
s.shiftName = p.shiftName where s.wholeDate >=‘+@date1+‘ and s.wholeDate <=’+@date2=‘ group by s.englishName,s.belongzu,s.shiftName'
exec(@SQL1)
commit Tran
end
set nocount on
GO
另外,拼接变量不能在字符串内啊,这样没用
create procedure [dbo].[baobiao1]
@date1 datetime,
@date2 datetime
as
set nocount on
begin
Set XACT_ABORT ON;
Begin Tran
Declare @SQL1 varchar(8000)
Declare @SQL2 varchar(8000)
--Set @SQL='Create view A as select ....'
--Exec(@SQL)
if exists (SELECT * FROM sysobjects WHERE name = 'report1')
begin
drop view report1
end
set @SQL1='create view report1 as select s.englishName,s.belongzu,count(*) kaitai,
jiachan=(case s.shiftName when ''甲'' then sum(s.realproduc) else 0 end),
jiachaochan=(case s.shiftName when ''甲'' then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
yichan=(case s.shiftName when ''乙'' then sum(s.realproduc) else 0 end),
yichaochan=(case s.shiftName when ''乙'' then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
bingchan=(case s.shiftName when''丙''then sum(s.realproduc) else 0 end),
bingchaochan=(case s.shiftName when''丙''then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
dingchan=(case s.shiftName when''丁''then sum(s.realproduc) else 0 end),
dingchaochan=(case s.shiftName when''丁''then sum(s.realproduc-s.singleplan*s.workminute/60) else 0 end),
(case when s.shiftName =''甲''then sum(p.cibushu) else 0 end) jiacibu,
(case when s.shiftName =''乙''then sum(p.cibushu) else 0 end) yicibu,
(case when s.shiftName =''丙''then sum(p.cibushu) else 0 end) bingcibu,
(case when s.shiftName =''丁''then sum(p.cibushu) else 0 end) dingcibu,
(case when s.shiftName =''甲''then sum(p.kaijianshu) else 0 end) jiakaijian,
(case when s.shiftName =''乙''then sum(p.kaijianshu) else 0 end) yikaijian,
(case when s.shiftName =''丙''then sum(p.kaijianshu) else 0 end) bingkaijian,
(case when s.shiftName =''丁''then sum(p.kaijianshu) else 0 end) dingkaijian
from HistoryPro1 s left outer join kaijianjicibu2 p on s.wholeDate = p.wholeDate AND
s.MachineID = p.MachineID AND
s.shiftName = p.shiftName where s.wholeDate >=‘+@date1+‘ and s.wholeDate <=’+@date2=‘ group by s.englishName,s.belongzu,s.shiftName'
exec(@SQL1)
commit Tran
end
set nocount on
GO
更多追问追答
追问
嗯,确实是因为拼接变量不能在字符串内,但是我用exec '2012-3-1','2012-4-1'命令后,还是不行啊,但是已经没有语法上的错误了
追答
呵呵,这应该是你语句的问题了。别人没有数据库,那么长的语句不好帮你调试。
你将拼接语句替换一下'2012-3-1','2012-4-1',然后整个create view 语句在查询分析器里面执行,看报错再调试吧。
哦,是先调select语句,你的语句太长了,没有数据不好看
展开全部
s.wholeDate >=@date1 其中的时间参数应该转成字符串才能拼接到语句里面去
可修改为s.wholeDate >=‘’+Convert(nvarchar(20),@date1,120)+''
可修改为s.wholeDate >=‘’+Convert(nvarchar(20),@date1,120)+''
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先你没有 report1 report2 这两个视图 , 还有在前面声明Declare datet@date1 datetime ,date2 datetime 变量 , 你试试看
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询