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

请教 运行下面的sql语句提示'00' 附近有语法错误。

declare @StartDate smalldatetime
declare @EndDate smalldatetime
declare @computName nvarchar(50)
declare @Vouchtype nvarchar(12)
set @StartDate='2010-05-01'
set @EndDate='2010-05-31'
set @computName='fht'
set @Vouchtype='01'
declare @Str_Query nvarchar(2000)
declare @Str_Query2 nvarchar(1000)
declare @Str_Query3 nvarchar(1000)
declare @JHdate smalldatetime
set @Str_Query='select a.Vouchtype, a.CCode, a.CustomerCode, c.customername,a.DDate,a.Productcode,b.productname,b.model,b.unit'
--计算case left(cRdCode,3) N'18' then (case when iAInQuantity is null then 0 else iAInQuantity end) else 0 end AS N'18数量',
declare CTJHjs cursor local forward_only for
select DISTINCT jhdate from ctsubsidiary
open CTJHjs
fetch next from CTJHjs into @JHdate
while @@fetch_status=0
  begin
set @Str_Query2=@Str_Query2 + ',case a.jhdate when '+convert(varchar(30),@JHdate,120) + ' then (case when bhnumber is null then 0 else bhnumber end) else 0 end as ' + convert(varchar(30),@JHdate,120)
fetch next from CTJHjs into @JHdate
  End
Close CTJHjs
DEALLOCATE CTJHjs
set @Str_Query3=' into tmpctjs'+@computName +' from ctsubsidiary a left join haierproductarchives b on a.productCode=b.productCode left join customerarchives c ON a.customercode = c.customercode Where a.cVouType= N' + @Vouchtype +
' and a.ddate>=' + convert(varchar(30),@StartDate,120) +' and a.ddate<='+ convert(varchar(30),@endDate,120)

 exec (@Str_Query+@Str_Query2+@Str_Query3)

------解决方案--------------------
动态SQL,估计是组合不当,参考
--动态sql语句基本语法
SQL code
 
1 :普通SQL语句可以用Exec执行 

eg: Select * from tableName 
Exec('select * from tableName') 
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL 

eg: 
declare @fname varchar(20) 
set @fname = 'FiledName' 
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 
Exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格 

当然将字符串改成变量的形式也可 
declare @fname varchar(20) 
set @fname = 'FiledName' --设置字段名 

declare @s varchar(1000) 
set @s = 'select ' + @fname + ' from tableName' 
Exec(@s) -- 成功 
exec sp_executesql @s -- 此句会报错 

declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) 
set @s = 'select ' + @fname + ' from tableName' 
Exec(@s) -- 成功 
exec sp_executesql @s -- 此句正确 

3. 输出参数 
declare @num int, 
@sqls nvarchar(4000) 
set @sqls='select count(*) from tableName' 
exec(@sqls) 
--如何将exec执行结果放入变量中? 

declare @num int, 
@sqls nvarchar(4000) 
set @sqls='select @a=count(*) from tableName ' 
exec sp_executesql @sqls,N'@a int output',@num output 
select @num