SQL--如何将Sql语句查询出来的结果作为⼀个表名再次进⾏查询
最近在做⼀个能源监控的项⽬,因为⽤到从表⾥获取数据后得知数据存在哪⼀个表⾥后,再获取那个表的数据,所以就遇到了⼀个表名不固定的情况,⼀开始的⽅式,是我分两条sql语句来执⾏:
1.第⼀条sql 是通过条件来查询数据 ex:tblName(这个数据就是要去调⽤数据的表名)
select HisTblName,HisFldName from TYcYt where StationId=1 and YcCommDevId=1 and CommDevYcOrder=170
sql语句怎么查询两张表的数据2.第⼆条语句就是执⾏select*等⼀些列的语句动作。
select Value1 from THisSampleFiveMinute_1
where SampleTime=(select max(SampleTime) from THisSampleFiveMinute_1 where cast(SampleTime as date)='2017/3/28 0:00:00')
那么有没有什么⽅法,可是⼀句sql语句来实现呢,思路是将第⼀次查询出来的数据做表名,再次进⾏查询等动作,答案是有的,那个就是要⽤的变量的声明、变量的赋值、动态
SQL(Exec)这些语句:
关于变量的声明、变量的赋值,可以参看之前写的关于select赋值的⽂章,这⾥重点讲下动态SQL(Exec)这⼀语句的使⽤⽅法:
字段名,表名,数据库名之类作为变量时,必须⽤动态SQL
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 错误!不会提⽰错误,但结果为固定值FiledName,并⾮所要。
Exec('select ' + @fname + ' from tableName') -- 正确!请注意加号前后的单引号的边上加空格
declare @fldName varchar(32) set @fldName=(select HisFldName from TYcYt where StationId=1 and YcCommDevId=1 and CommDevYcOrder=170)
declare @tblName varchar(32) set @tblName=(select HisTblName from TYcYt where StationId=1 and YcCommDevId=1 and CommDevYcOrder=170)
Exec
(
'select '+@fldName+' from '+@tblName
+' where SampleTime=(select max(SampleTime) from '+@tblName +' where cast(SampleTime as date)=''2017/3/29 0:00:00'')'
)
这⾥有⼀个问题,就是如果sql当中时间是变化的怎么办,想普通sql⼀样把时间单独独⽴出来就可以吗?其实是不⾏的,再动态SQL(Exec)中,必须将时间声明⼀个变量才可以,不然就会报错:
declare @fldName varchar(32) set @fldName=(select HisFldName from TYcYt where StationId=1 and YcCommDevId=1 and CommDevYcOrder=170)
declare @tblName varchar(32) set @tblName=(select HisTblName from TYcYt where StationId=1 and YcCommDevId=1 and CommDevYcOrder=170)
declare @dt datetime set @dt='2017/3/29 0:00:00'
Exec
(
'select '+@fldName+' from '+@tblName
+' where SampleTime=(select max(SampleTime) from '+@tblName +' where cast(SampleTime as date)='''+@dt+''')'
)
⾄此,⼤功告成-----姜彦 20170331
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论