日期:2014-05-17  浏览次数:20545 次

还是动态SQL的问题,“必须声明标量变量”?

--赋值当前时间
declare @endtime datetime
declare @begintime datetime
declare @year nvarchar(4)
declare @ln nvarchar(1000)
declare @str nvarchar(1000)

select @endtime=getdate()
  ,@begintime=dateadd(dd,-120,getdate())
  ,@year=year(getdate())
--统计目标表中LN站特定时间的记录总数
declare @select2 int
--统计LN表中特定时间的记录总数
set @str='SELECT count(*)
  FROM openrowset(''SQLOLEDB'',''172.19.18.133'';''sa'';''sa'',Meso_'+@year+'.dbo.LN_'+@year+' ) 
where DATEPART(minute, cast(观测时间 as dateTime))=0 and @begintime<观测时间 and 观测时间<@endtime '
exec(@str)
---------------------------
消息 137,级别 15,状态 2,第 3 行
必须声明标量变量 "@begintime"。
------------------------
动态SQL,有些问题还是弄不太清楚。


------解决方案--------------------
动态执行要把datetime转成字符串.
set @str='SELECT count(*) 
FROM openrowset(''SQLOLEDB'',''172.19.18.133'';''sa'';''sa'',Meso_'+@year+'.dbo.LN_'+@year+' ) 
where DATEPART(minute, cast(观测时间 as dateTime))=0 and '+@begintime+' <观测时间 and 观测时间 <'+@endtime 

改为:
set @str='SELECT count(*) 
FROM openrowset(''SQLOLEDB'',''172.19.18.133'';''sa'';''sa'',Meso_'+@year+'.dbo.LN_'+@year+' ) 
where DATEPART(minute, cast(观测时间 as dateTime))=0 and '''+convert(varhcar(30),@begintime)+''' <观测时间 and 观测时间 <'+convert(varchar(30),@endtime)+'''';