博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL--如何将Sql语句查询出来的结果作为一个表名 再次进行查询
阅读量:5084 次
发布时间:2019-06-13

本文共 1908 字,大约阅读时间需要 6 分钟。

   最近在做一个能源监控的项目,因为用到从表里获取数据后得知数据存在哪一个表里后,再获取那个表的数据,所以就遇到了一个表名不固定的情况,一开始的方式,是我分两条sql语句来执行:

  1.第一条sql 是通过条件来查询数据 ex:tblName(这个数据就是要去调用数据的表名)     

select HisTblName,HisFldName from TYcYt where StationId=1 and YcCommDevId=1 and CommDevYcOrder=170

  

 

  2.第二条语句就是执行select*from tblName........等一些列的语句动作。

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

转载于:https://www.cnblogs.com/jiangyan219/articles/6651542.html

你可能感兴趣的文章
我们应该怎么去理解.net类型传递 .
查看>>
[Leetcode] Next Permutation
查看>>
类加载器实战剖析与疑难点解析
查看>>
在NodeJS中配置aws ec2
查看>>
5月29日任务 11.18 Apache用户认证 11.19/11.20 域名跳转 11.21 Apache访问日志
查看>>
堆和栈
查看>>
Etag和断点续传(转)
查看>>
atomic/nio
查看>>
git使用问题
查看>>
用StreamReader提取xml或者记事本里面的信息
查看>>
需求分析
查看>>
《将博客搬至CSDN》
查看>>
erlang 游戏服务器开发
查看>>
一个完整的socket recv()案例,包括解决粘包、服务器主动推数据的问题
查看>>
运行nodejs的blog程序遇见问题
查看>>
sql server 导出脚本和数据 (图解)
查看>>
python自然语言处理——3.7 用正则表达式为文本分词
查看>>
俄罗斯方块html
查看>>
Ubuntu 16.04安装indicator-sysmonitor实现导航条显示上下行网速/CPU/内存使用率
查看>>
MyBatis3-SqlSessionDaoSupport的使用
查看>>