对多个数据库和表的SQL请求

时间:2014-09-12 10:16:33

标签: sql sql-server database

我遇到了很多问题。

我们机器的过程数据存储在多个MS SQL数据库中。 可以安装和卸载不再使用或应归档的数据。 这就是为什么有多个数据库的原因。 在每个数据库中,存在多个表,其中包含一个或多个测量点的数据值。

JOIN Query我可以从一个表中获取具有相应表和标记名的值:

> SELECT HA_DATA_yyyy.R_xxxxx.time HA_DATA_yyyy.R_xxxxx.value, HA_DATA_yyyy.tags.tagname FROM HA_DATA_yyyy.R_xxxxx
> INNER JOIN HA_DATA_yyyy.RI_xxxxx ON HA_DATA_yyyy.R_xxxxx.id = HA_DATA_yyyy.RI_xxxxx.id
> INNER JOIN HA_DATA_yyyy.tags on HA_DATA_yyyy.RI_xxxxx.tag_uuid = HA_DATA_yyyy.tags.tag_uuid
> WHERE (HA_DATA_yyyy.tags.tagname like 'tagname')

yyyy - 表示数据库的编号 xxxxx - 表示数据库服务器上唯一的数字,但每个数据库中有不同的数字。

但是现在我正在寻找一种解决方案,以便为数据库的所有R_xxxxx表和所有已安装的数据库获取此信息。

如果没有外部软件,有没有办法做到这一点?只是使用正确的查询请求或用户定义的函数/存储过程?

2 个答案:

答案 0 :(得分:0)

请查看 Stackoverflow 问题的答案:

Archiving large amounts of old data in SQL Server

我认为这可能就是你所需要的。

<强>更新 您可以使用SQL查询查询已装入的数据库:

select Name into #myDatabases -- get all mounted databases into #myDatabases
from sys.databases 
where (has_dbaccess(name) > 0) 
and name not in ('master', 'tempdb', 'model', 'msdb') 
order by 1

select * from #myDatabases -- list all mounted databases

drop table #myDatabases -- don't forget to drop it at the end

这可用于创建动态SQL语句,您可以通过sp_executesql命令执行该语句:

EXECUTE sp_executesql @SQL_String, @Parameter_Definition, @Param1, ..., @ParamN

参数定义是一个包含参数名称列表及其数据类型的字符串。 因此,您可以根据上面的数据库列表构建自己的查询,然后执行它。

答案 1 :(得分:0)

也许动态sql是一个选项 作为起点,您可以使用数据库列表:

insert into #dblist (dbname) 
select d.name from sys.databases d where d.name like 'HA_DATA_%'

然后为每个数据库收集表的列表以从中读取数据(您可以根据需要使用游标或其他循环):

declare @dbname varchar(128) = ''
declare @dynsql nvarchar(max)
create table #listoftables (name varchar(128), db varchar(128))
while exists(select top 1 dbname from #dblist where dbname > @dbname order by dbname)
begin
   set @dynsql = 'insert into #listoftables(name,db) select name,''' + @db + ''' from '+ @db +'.sys.tables'
  exec sp_executesql @statement = @dynsql

  -- move on to next db
  select top 1 @dbname = dbname from #dblist where dbname > @dbname order by dbname
end

现在你有一个表格列表可以循环建立一个动态查询来一次读取所有数据 谨防使用动态sql可能产生的许多问题; herethere你可以找到前两个收集的结果,并解释为什么你必须小心使用动态sql。