sql-server - 从多个数据库中获取数据 - 动态数据库
问题描述
我们将 SQL Server 2014 Enterprise 与许多数据库一起使用。我必须使用EXACT SAME Schema从每个数据库执行查询并获取报告/数据,并且数据库以Cab开头
当在我们的 ERP 项目中添加新公司时,将使用以Cab开头的精确模式创建新数据库,并为其分配递增编号,如下所示:
Cab1
Cab2
Cab3
Cab5
Cab10
我可以得到数据库名称:
SELECT name
FROM master.sys.databases
where [name] like 'Cab%' order by [name]
我必须创建一个存储过程来从每个数据库的表中获取数据。
如何使用存储过程来做到这一点,因为数据库是从Cab开始动态创建的?
解决方案
如果必须传递参数,可以使用 EXEC(@Statement) 或 EXEC SP_EXECUTESQL。
CREATE OR ALTER PROCEDURE dbo.GetDataFromAllDatabases
AS
BEGIN
DECLARE @T TABLE (id INT NOT NULL IDENTITY(1, 1), dbName VARCHAR(256) NOT NULL)
INSERT INTO @T
SELECT NAME FROM MASTER.SYS.DATABASES WHERE [NAME] LIKE 'Cab%' ORDER BY [NAME]
CREATE TABLE #AllData (......)
DECLARE @Id INT, @DbName VARCHAR(128)
SELECT @Id = MIN(Id) FROM @T
WHILE @Id IS NOT NULL
BEGIN
SELECT @DbName = dbName FROM @T WHERE Id = @Id
DECLARE @Statement NVARCHAR(MAX)
SET @Statement = CONCAT(N'INSERT INTO #AllData (...) SELECT .... FROM ', @DbName, '.dbo.[TableName]')
EXEC(@Statement);
--YOU CAN USE BELOW LINE TOO IF YOU NEED TO PASS VARIABLE
--EXEC SP_EXECUTESQL @Statement, '@Value INT', @Value = 128
SET @Id = (SELECT MIN(Id) FROM @T WHERE Id > @Id)
END
END
推荐阅读
- java - Apache Tomcat 不能通过 IntelliJ 工作,但在手动启动时工作
- angularjs - Angular - 需要输入字段
- apache-spark - 如何自动化 Spark 读取?
- javascript - 我可以使用表达式作为对象属性的值吗?
- xamarin.forms - 动态更新的 Xamarin.Forms ContentPage 内容不响应 iOS 平台的用户操作
- python - 来自 numba 的 jit 和来自 scipy 的 hypergeom 的断言错误
- python - pd.merge 给出错误:DataFrame' 对象是可变的,因此它们不能被散列
- java - Spring Boot - Jwts.builder 无法解析方法'signWith()'
- json - 按字母顺序对 JSON 对象数组以及 dart 中属性的布尔值进行排序
- javascript - 在特定索引后随机播放数组