【发布时间】:2016-02-22 16:00:42
【问题描述】:
我有大约 60 个要查询的数据库具有相同的表;但是,我希望将查询的结果插入到临时表中,以便可以使用存储在该临时表中的结果创建格式正确的报告。 我该如何做到这一点? 下面是我的查询,它遍历每个数据库并运行查询以选择所有活动订单:
DECLARE @db_name Varchar(100)
DECLARE @SQL Varchar(3000)
DECLARE c_db_names CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases
WHERE name NOT IN('master','AdventureWorks2008','TestDB','Development','Northwind') --might need to exclude more databases
OPEN c_db_names
FETCH c_db_names INTO @db_name
WHILE @@Fetch_Status = 0
BEGIN
SET @SQL = 'SELECT OrderID, OrderStatus, OrderDetails, FulfillmentDate, ShippingDate , AddDate from
'+ @db_name +'.dbo.ActiveOrders inner join '+ @db_name +'.dbo.FinalShipmentNumbers on '+ @db_name +'.dbo.ActiveOrders.OrderDetails =
'+ @db_name +'.dbo.FinalShipmentNumbers.OrderID where addDate between ''1/30/2016'' and ''2/26/2016'''
SELECT @db_name As Client_Name
EXEC(@SQL)
FETCH c_db_names INTO @db_name
END
CLOSE c_db_names
DEALLOCATE c_db_names
【问题讨论】:
-
也许有插入语句?
-
在我提供的上述查询中添加到哪里?我读过 SELECT * INTO tempTable 应该可以工作,但是如何使用这个呢?
-
选择 INTO 仅在目标表不存在时有效。显然,在游标中,它将第二次存在,因此它会失败。我认为您对此想得太多了,并且使事情变得比需要的更复杂。创建一个临时表并将插入添加到 #YourTable 中,作为动态 sql 的一部分,在 select 语句之前。您的动态 sql 的上下文将始终是您开始的数据库。
-
在这个查询中运行了两条 SELECT 语句,第一个是返回客户端名称以便我知道结果属于哪个数据库,第二个是 EXEC(@SQL) 循环每个数据库的表。如何插入两者?
-
对……正如我所说。将插入内容放入您的动态 sql 中。
标签: sql-server cursor temp-tables