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

存储过程运行报在应使用条件的上下文(在 ')' 附近)中指定了非布尔类型的表达式的异常

2013-12-20 
存储过程运行报在应使用条件的上下文(在 ')' 附近)中指定了非布尔类型的表达式的错误alterPROCE

存储过程运行报在应使用条件的上下文(在 ')' 附近)中指定了非布尔类型的表达式的错误
alter  PROCEDURE [dbo].[Sourcefenxi](@dDate datetime,@BuilldNo nvarchar(20))    

AS

begin
   declare @Sql nvarchar(max) 
   declare @tableName nvarchar(100)
   declare @tableName2 nvarchar(100)
   
   --选择最适用的数据表    
  set @tableName = 'dbo.TMETER'  + CAST(datepart(YYYY,@dDate) as varchar(4))
  set @tableName2 = 'dbo.TELECTRI' + CAST(datepart(YYYY,@dDate) as varchar(4))
   --拼接查询语句
  set @Sql = N'    
 
       
 
select c.AREAGUID,c.BUILDNO,c.BUILDNAME,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,累计耗热,计划供热,单日供热量,热量单耗,抄表时间 from TBUILD as c,(
select f.AREAGUID ,f.BUILDNO,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,f.METERNLRL as 累计耗热 ,f.METERJHGR as 计划供热,f.METERDAN as 单日供热量,f.METERRLDH as 热量单耗, d.抄表时间 from '+@tableName+' as f,
(select a.AREAGUID,a.buildno,a. METERNLLJ as 累计耗电量,a.METERDAY as 当日耗电 ,a.METERDAN as 电单耗,b.METERNLLJ as 累计耗水量,b.METERDAY as 当日耗水量,b.METERDAN as 水单耗,b.DDATE as 抄表时间 
from '+@tableName2+' as a inner join (select e.BUILDNO,e.AREAGUID,e.DDATE,e.DEVICETYPE, e.METERNLLJ,e.METERDAY,e.METERDAN from '+@tableName2+' as e where e.DEVICETYPE=11)as b
on a.DDate=b.DDate and a.AREAGUID=b.AREAGUID and a.BUILDNO=b.BUILDNO and a.DEVICETYPE=10
and convert(varchar(20),a.DDate,23))='''+ convert(varchar(20),@dDate,23) +''' and a.BUILDNO='+@BuilldNo+'
)d
where f.AREAGUID=d.AREAGUID and f.BUILDNO=d.BUILDNO and f.DDATE=d.抄表时间 and CONVERT(varchar(20),f.DDate,112)='''+convert(varchar(20),@dDate,23)+''' and f.BUILDNO='+@BuilldNo+')as g
where c.AREAGUID=g.AREAGUID and c.BUILDNO=g.BUILDNO    
 

exec(@Sql)      
end;

GO

报 在应使用条件的上下文(在 ')' 附近)中指定了非布尔类型的表达式。的错误
[解决办法]

declare @dDate datetime,@BuilldNo nvarchar(20)    
set @dDate='2013-12-12'
set @BuilldNo='A0001'
   declare @Sql nvarchar(max) 
   declare @tableName nvarchar(100)
   declare @tableName2 nvarchar(100)
   
   --选择最适用的数据表    
  set @tableName = 'dbo.TMETER'  + CAST(datepart(YYYY,@dDate) as varchar(4))
  set @tableName2 = 'dbo.TELECTRI' + CAST(datepart(YYYY,@dDate) as varchar(4))
   --拼接查询语句
  set @Sql = N'    

select c.AREAGUID,c.BUILDNO,c.BUILDNAME,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,累计耗热,计划供热,单日供热量,热量单耗,抄表时间 from TBUILD as c,(
select f.AREAGUID ,f.BUILDNO,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,f.METERNLRL as 累计耗热 ,f.METERJHGR as 计划供热,f.METERDAN as 单日供热量,f.METERRLDH as 热量单耗, d.抄表时间 from '+@tableName+' as f,
(select a.AREAGUID,a.buildno,a. METERNLLJ as 累计耗电量,a.METERDAY as 当日耗电 ,a.METERDAN as 电单耗,b.METERNLLJ as 累计耗水量,b.METERDAY as 当日耗水量,b.METERDAN as 水单耗,b.DDATE as 抄表时间 
from '+@tableName2+' as a inner join (select e.BUILDNO,e.AREAGUID,e.DDATE,e.DEVICETYPE, e.METERNLLJ,e.METERDAY,e.METERDAN from '+@tableName2+' as e where e.DEVICETYPE=11)as b
on a.DDate=b.DDate and a.AREAGUID=b.AREAGUID and a.BUILDNO=b.BUILDNO and a.DEVICETYPE=10
and convert(varchar(20),a.DDate,23))='''+ convert(varchar(20),@dDate,23) +''' and a.BUILDNO='+@BuilldNo+'  -->这一行多了一个右“)"
)d
where f.AREAGUID=d.AREAGUID and f.BUILDNO=d.BUILDNO and f.DDATE=d.抄表时间 and CONVERT(varchar(20),f.DDate,112)='''+convert(varchar(20),@dDate,23)+''' and f.BUILDNO='+@BuilldNo+')as g
where c.AREAGUID=g.AREAGUID and c.BUILDNO=g.BUILDNO    

print(@Sql)      



 
select c.AREAGUID,c.BUILDNO,c.BUILDNAME,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,累计耗热,计划供热,单日供热量,热量单耗,抄表时间 from TBUILD as c,(


select f.AREAGUID ,f.BUILDNO,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,f.METERNLRL as 累计耗热 ,f.METERJHGR as 计划供热,f.METERDAN as 单日供热量,f.METERRLDH as 热量单耗, d.抄表时间 from dbo.TMETER2013 as f,
(select a.AREAGUID,a.buildno,a. METERNLLJ as 累计耗电量,a.METERDAY as 当日耗电 ,a.METERDAN as 电单耗,b.METERNLLJ as 累计耗水量,b.METERDAY as 当日耗水量,b.METERDAN as 水单耗,b.DDATE as 抄表时间 
from dbo.TELECTRI2013 as a inner join (select e.BUILDNO,e.AREAGUID,e.DDATE,e.DEVICETYPE, e.METERNLLJ,e.METERDAY,e.METERDAN from dbo.TELECTRI2013 as e where e.DEVICETYPE=11)as b
on a.DDate=b.DDate and a.AREAGUID=b.AREAGUID and a.BUILDNO=b.BUILDNO and a.DEVICETYPE=10
and convert(varchar(20),a.DDate,23)='2013-12-12' and a.BUILDNO=A0001
)d
where f.AREAGUID=d.AREAGUID and f.BUILDNO=d.BUILDNO and f.DDATE=d.抄表时间 and CONVERT(varchar(20),f.DDate,112)='2013-12-12' and f.BUILDNO=A0001)as g
where c.AREAGUID=g.AREAGUID and c.BUILDNO=g.BUILDNO    
 


[解决办法]
实在执行时报的错吗?
[解决办法]
正确的如下:

alter  PROCEDURE [dbo].[Sourcefenxi](@dDate datetime,@BuilldNo nvarchar(20))    
AS
begin
   declare @Sql nvarchar(max) 
   declare @tableName nvarchar(100)
   declare @tableName2 nvarchar(100)
   
   --选择最适用的数据表    
  set @tableName = 'dbo.TMETER'  + CAST(datepart(YYYY,@dDate) as varchar(4))
  set @tableName2 = 'dbo.TELECTRI' + CAST(datepart(YYYY,@dDate) as varchar(4))
   --拼接查询语句
  set @Sql = N'    
select c.AREAGUID,c.BUILDNO,c.BUILDNAME,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,累计耗热,计划供热,单日供热量,热量单耗,抄表时间 from TBUILD as c,(
select f.AREAGUID ,f.BUILDNO,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,f.METERNLRL as 累计耗热 ,f.METERJHGR as 计划供热,f.METERDAN as 单日供热量,f.METERRLDH as 热量单耗, d.抄表时间 from '+@tableName+' as f,
(select a.AREAGUID,a.buildno,a. METERNLLJ as 累计耗电量,a.METERDAY as 当日耗电 ,a.METERDAN as 电单耗,b.METERNLLJ as 累计耗水量,b.METERDAY as 当日耗水量,b.METERDAN as 水单耗,b.DDATE as 抄表时间 
from '+@tableName2+' as a inner join (select e.BUILDNO,e.AREAGUID,e.DDATE,e.DEVICETYPE, e.METERNLLJ,e.METERDAY,e.METERDAN from '+@tableName2+' as e where e.DEVICETYPE=11)as b
on a.DDate=b.DDate and a.AREAGUID=b.AREAGUID and a.BUILDNO=b.BUILDNO and a.DEVICETYPE=10
and convert(varchar(20),a.DDate,23)='''+ convert(varchar(20),@dDate,23) +''' and a.BUILDNO='+@BuilldNo+'
)d
where f.AREAGUID=d.AREAGUID and f.BUILDNO=d.BUILDNO and f.DDATE=d.抄表时间 and CONVERT(varchar(20),f.DDate,112)='''+convert(varchar(20),@dDate,23)+''' and f.BUILDNO='+@BuilldNo+')as g
where c.AREAGUID=g.AREAGUID and c.BUILDNO=g.BUILDNO    

exec(@Sql)      
end;

GO

[解决办法]
改了一下,你试试这个:
alter  PROCEDURE [dbo].[Sourcefenxi](@dDate datetime,@BuilldNo nvarchar(20))    

AS

begin
   declare @Sql nvarchar(max) 
   declare @tableName nvarchar(100)
   declare @tableName2 nvarchar(100)
   
   --选择最适用的数据表    
  set @tableName = 'dbo.TMETER'  + CAST(datepart(YYYY,@dDate) as varchar(4))
  set @tableName2 = 'dbo.TELECTRI' + CAST(datepart(YYYY,@dDate) as varchar(4))
   --拼接查询语句
  set @Sql = N'    
 
       
 
select c.AREAGUID,c.BUILDNO,c.BUILDNAME,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,累计耗热,计划供热,单日供热量,热量单耗,抄表时间 from TBUILD as c,(
select f.AREAGUID ,f.BUILDNO,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,f.METERNLRL as 累计耗热 ,f.METERJHGR as 计划供热,f.METERDAN as 单日供热量,f.METERRLDH as 热量单耗, d.抄表时间 from '+@tableName+' as f,
(select a.AREAGUID,a.buildno,a. METERNLLJ as 累计耗电量,a.METERDAY as 当日耗电 ,a.METERDAN as 电单耗,b.METERNLLJ as 累计耗水量,b.METERDAY as 当日耗水量,b.METERDAN as 水单耗,b.DDATE as 抄表时间 
from '+@tableName2+' as a inner join (select e.BUILDNO,e.AREAGUID,e.DDATE,e.DEVICETYPE, e.METERNLLJ,e.METERDAY,e.METERDAN from '+@tableName2+' as e where e.DEVICETYPE=11)as b
on a.DDate=b.DDate and a.AREAGUID=b.AREAGUID and a.BUILDNO=b.BUILDNO and a.DEVICETYPE=10
and convert(varchar(20),a.DDate,23)='''+ convert(varchar(20),@dDate,23) +''' and a.BUILDNO='+@BuilldNo+'
)t)d


where f.AREAGUID=d.AREAGUID and f.BUILDNO=d.BUILDNO and f.DDATE=d.抄表时间 and CONVERT(varchar(20),f.DDate,112)='''+convert(varchar(20),@dDate,23)+''' and f.BUILDNO='+@BuilldNo+')as g
where c.AREAGUID=g.AREAGUID and c.BUILDNO=g.BUILDNO    
 

--exec(@Sql)      
print @sql

end;

GO


[解决办法]
在改一下:
alter  PROCEDURE [dbo].[Sourcefenxi](@dDate datetime,@BuilldNo nvarchar(20))    

AS

begin
   declare @Sql nvarchar(max) 
   declare @tableName nvarchar(100)
   declare @tableName2 nvarchar(100)
   
   --选择最适用的数据表    
  set @tableName = 'dbo.TMETER'  + CAST(datepart(YYYY,@dDate) as varchar(4))
  set @tableName2 = 'dbo.TELECTRI' + CAST(datepart(YYYY,@dDate) as varchar(4))
   --拼接查询语句
  set @Sql = N'    
 
       
 
select c.AREAGUID,c.BUILDNO,c.BUILDNAME,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,累计耗热,计划供热,单日供热量,热量单耗,抄表时间 from TBUILD as c,(
select f.AREAGUID ,f.BUILDNO,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,f.METERNLRL as 累计耗热 ,f.METERJHGR as 计划供热,f.METERDAN as 单日供热量,f.METERRLDH as 热量单耗, d.抄表时间 from '+@tableName+' as f,
(select a.AREAGUID,a.buildno,a. METERNLLJ as 累计耗电量,a.METERDAY as 当日耗电 ,a.METERDAN as 电单耗,b.METERNLLJ as 累计耗水量,b.METERDAY as 当日耗水量,b.METERDAN as 水单耗,b.DDATE as 抄表时间 
from '+@tableName2+' as a inner join (select e.BUILDNO,e.AREAGUID,e.DDATE,e.DEVICETYPE, e.METERNLLJ,e.METERDAY,e.METERDAN from '+@tableName2+' as e where e.DEVICETYPE=11)as b
on a.DDate=b.DDate and a.AREAGUID=b.AREAGUID and a.BUILDNO=b.BUILDNO and a.DEVICETYPE=10
and convert(varchar(20),a.DDate,23)='''+ convert(varchar(20),@dDate,23) +''' and a.BUILDNO='+@BuilldNo+'
)d
where f.AREAGUID=d.AREAGUID and f.BUILDNO=d.BUILDNO and f.DDATE=d.抄表时间 and CONVERT(varchar(20),f.DDate,112)='''+convert(varchar(20),@dDate,23)+''' and f.BUILDNO='+@BuilldNo+')as g
where c.AREAGUID=g.AREAGUID and c.BUILDNO=g.BUILDNO    
 

--exec(@Sql)      
print @sql

end;

GO

[解决办法]
and convert(varchar(20),a.DDate,23))=

改成了 ]and convert(varchar(20),a.DDate,23)= 就行了
[解决办法]
那分析一下有没有符合条件的记录?如果不符合where后面的条件是没有记录的
[解决办法]
引用:
Quote: 引用:

正确的如下:

alter  PROCEDURE [dbo].[Sourcefenxi](@dDate datetime,@BuilldNo nvarchar(20))    
AS
begin
   declare @Sql nvarchar(max) 
   declare @tableName nvarchar(100)
   declare @tableName2 nvarchar(100)
   
   --选择最适用的数据表    
  set @tableName = 'dbo.TMETER'  + CAST(datepart(YYYY,@dDate) as varchar(4))
  set @tableName2 = 'dbo.TELECTRI' + CAST(datepart(YYYY,@dDate) as varchar(4))
   --拼接查询语句
  set @Sql = N'    
select c.AREAGUID,c.BUILDNO,c.BUILDNAME,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,累计耗热,计划供热,单日供热量,热量单耗,抄表时间 from TBUILD as c,(
select f.AREAGUID ,f.BUILDNO,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,f.METERNLRL as 累计耗热 ,f.METERJHGR as 计划供热,f.METERDAN as 单日供热量,f.METERRLDH as 热量单耗, d.抄表时间 from '+@tableName+' as f,
(select a.AREAGUID,a.buildno,a. METERNLLJ as 累计耗电量,a.METERDAY as 当日耗电 ,a.METERDAN as 电单耗,b.METERNLLJ as 累计耗水量,b.METERDAY as 当日耗水量,b.METERDAN as 水单耗,b.DDATE as 抄表时间 
from '+@tableName2+' as a inner join (select e.BUILDNO,e.AREAGUID,e.DDATE,e.DEVICETYPE, e.METERNLLJ,e.METERDAY,e.METERDAN from '+@tableName2+' as e where e.DEVICETYPE=11)as b
on a.DDate=b.DDate and a.AREAGUID=b.AREAGUID and a.BUILDNO=b.BUILDNO and a.DEVICETYPE=10
and convert(varchar(20),a.DDate,23)='''+ convert(varchar(20),@dDate,23) +''' and a.BUILDNO='+@BuilldNo+'
)d
where f.AREAGUID=d.AREAGUID and f.BUILDNO=d.BUILDNO and f.DDATE=d.抄表时间 and CONVERT(varchar(20),f.DDate,112)='''+convert(varchar(20),@dDate,23)+''' and f.BUILDNO='+@BuilldNo+')as g
where c.AREAGUID=g.AREAGUID and c.BUILDNO=g.BUILDNO    

exec(@Sql)      
end;

GO



错误没有报了,但是咱们没有查询结果啊



你把那个exec 注释掉:

--exec

然后加一个:

 print @sql

执行后,看看,打印出来的语句是否有问题
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

正确的如下:

alter  PROCEDURE [dbo].[Sourcefenxi](@dDate datetime,@BuilldNo nvarchar(20))    
AS
begin
   declare @Sql nvarchar(max) 
   declare @tableName nvarchar(100)
   declare @tableName2 nvarchar(100)
   
   --选择最适用的数据表    
  set @tableName = 'dbo.TMETER'  + CAST(datepart(YYYY,@dDate) as varchar(4))
  set @tableName2 = 'dbo.TELECTRI' + CAST(datepart(YYYY,@dDate) as varchar(4))
   --拼接查询语句
  set @Sql = N'    
select c.AREAGUID,c.BUILDNO,c.BUILDNAME,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,累计耗热,计划供热,单日供热量,热量单耗,抄表时间 from TBUILD as c,(
select f.AREAGUID ,f.BUILDNO,累计耗电量,当日耗电,电单耗,累计耗水量,当日耗水量,水单耗,f.METERNLRL as 累计耗热 ,f.METERJHGR as 计划供热,f.METERDAN as 单日供热量,f.METERRLDH as 热量单耗, d.抄表时间 from '+@tableName+' as f,
(select a.AREAGUID,a.buildno,a. METERNLLJ as 累计耗电量,a.METERDAY as 当日耗电 ,a.METERDAN as 电单耗,b.METERNLLJ as 累计耗水量,b.METERDAY as 当日耗水量,b.METERDAN as 水单耗,b.DDATE as 抄表时间 
from '+@tableName2+' as a inner join (select e.BUILDNO,e.AREAGUID,e.DDATE,e.DEVICETYPE, e.METERNLLJ,e.METERDAY,e.METERDAN from '+@tableName2+' as e where e.DEVICETYPE=11)as b
on a.DDate=b.DDate and a.AREAGUID=b.AREAGUID and a.BUILDNO=b.BUILDNO and a.DEVICETYPE=10
and convert(varchar(20),a.DDate,23)='''+ convert(varchar(20),@dDate,23) +''' and a.BUILDNO='+@BuilldNo+'
)d
where f.AREAGUID=d.AREAGUID and f.BUILDNO=d.BUILDNO and f.DDATE=d.抄表时间 and CONVERT(varchar(20),f.DDate,112)='''+convert(varchar(20),@dDate,23)+''' and f.BUILDNO='+@BuilldNo+')as g
where c.AREAGUID=g.AREAGUID and c.BUILDNO=g.BUILDNO    

exec(@Sql)      
end;

GO


错误没有报了,但是咱们没有查询结果啊


你把那个exec 注释掉:

--exec

然后加一个:

 print @sql

执行后,看看,打印出来的语句是否有问题

是有符号条件的记录的


要不,给个qq号,方便的话,帮你看看

热点排行