从不同数据库中的 2 个表中获取值到另一个 table
Get values from 2 Tables in different Databases into another table
我有一个说 MasterDB
的数据库,它在 Table tbl_B
中有一些数据库名称的列表。每个数据库名称都由一个 ID 标识。
table tbl_B
的结构如下
tbl_B
ID | DB_Name
-------------
1 | DelhiDB
2 | MumbaiDB
有同名的数据库,即 DelhiDB 和 MumbaiDB,它们每个都有一个 Table,名称为 tbl_C
,其中包含一些数据,例如
tbl_C 德里
custIDDelhi | custNameDelhi | CustPhoneDelhi |
----------------------------------------------
1 | John | 123456 |
2 | Monika | 789945 |
这里请注意两个数据库的列名可以不同
另请注意,DelhiDB
和 MumbaiDB
是独立的数据库,每个数据库都有一个名为 tbl_C
[=26] 的 table =]
我想在 MasterDB
中创建一个名为 tblCusotmer_Dictionary
的 Table
数据是这样的
ColumnName | DataBaseName | DataBaseID | db_ColumnNamme
-----------------------------------------------------------
CustomerID | DelhiDB | 1 | custIDDelhi
CustomerName | DelhiDB | 1 | custNameDelhi
CustomerPhone | DelhiDB | 1 | CustPhoneDElhi
CustomerID | MumbaiDB | 2 | custIDMumbai
CustomerName | MumbaiDB | 2 | custNameMumbai
CustomerPhone | MumbaiDB | 2 | CustPhoneMumbai
这里我不需要任何客户数据,只需要来自两个数据库的列名列表以及数据库名称和 ID,
上面 table 中的 ColumnName
列是我给 db_ColumnNamme
列的通用名称
为了简单起见,我以 2 个数据库和 3 个列为例,但是可以有 N 个数据库,每个数据库都有一个 table 同名(此处为 tbl_c
),固定编号列。
如有任何说明,请在评论中告诉我。
您似乎想要:
select t.colsname as ColumnName,
b.db_name as DataBaseName,
b.id as DataBaseID,
t.cols as db_ColumnNamme
from tbl_C c
cross apply (values ('custID', 'CustomerID'), ('custName', 'CustomerName'),
('CustPhone', 'CustomerPhone')
) t (cols, colsname)
inner join tbl_B b on b.id = c.custID;
如果我正确理解了您的问题,那么下面就是您正在寻找的解决方案。让我知道它是否适合你。
DECLARE @tblDatabaseName AS TABLE (Id INT, dbName VARCHAR(100))
--DROP TABLE #tmpREcord
INSERT INTO @tblDatabaseName(id,dbName) VALUES (1,'DelhiDB'),(1,'MumbaiDB')
DECLARE @SQL AS VARCHAR(8000)
DECLARE @Id INT
DECLARE @dbName AS VARCHAR(100)
CREATE TABLE #tmpRecord (
columnName VARCHAR(20),DBID INT, DatabaseName VARCHAR(100))
DECLARE cur_Traverse CURSOR FOR SELECT Id , dbName FROM @tblDatabaseName
OPEN cur_Traverse
FETCH NEXT FROM cur_Traverse INTO @id ,@dbName
WHILE @@FETCH_STATUS =0
BEGIN
SET @SQL = 'INSERT INTO #tmpRecord (ColumnName,DbId,DatabaseName )
SELECT name ,' + CONVERT(VARCHAR(10),@Id) + ' AS DBID, ''' + @dbName + ''' as dbname'
+ ' FROM ' + @dbName + '.sys.all_columns s
WHERE object_Id = (SELECT TOP(1) object_Id FROM ' + @dbName + '.sys.all_objects WHERE name=''tbl_C'')'
PRINT @SQL
EXECUTE (@SQL)
FETCH NEXT FROM cur_Traverse INTO @Id, @dbName
END
CLOSE cur_Traverse
DEALLOCATE cur_Traverse
SELECT * FROM #tmpRecord
我有一个说 MasterDB
的数据库,它在 Table tbl_B
中有一些数据库名称的列表。每个数据库名称都由一个 ID 标识。
table tbl_B
的结构如下
tbl_B
ID | DB_Name
-------------
1 | DelhiDB
2 | MumbaiDB
有同名的数据库,即 DelhiDB 和 MumbaiDB,它们每个都有一个 Table,名称为 tbl_C
,其中包含一些数据,例如
tbl_C 德里
custIDDelhi | custNameDelhi | CustPhoneDelhi |
----------------------------------------------
1 | John | 123456 |
2 | Monika | 789945 |
这里请注意两个数据库的列名可以不同
另请注意,DelhiDB
和 MumbaiDB
是独立的数据库,每个数据库都有一个名为 tbl_C
[=26] 的 table =]
我想在 MasterDB
tblCusotmer_Dictionary
的 Table
数据是这样的
ColumnName | DataBaseName | DataBaseID | db_ColumnNamme
-----------------------------------------------------------
CustomerID | DelhiDB | 1 | custIDDelhi
CustomerName | DelhiDB | 1 | custNameDelhi
CustomerPhone | DelhiDB | 1 | CustPhoneDElhi
CustomerID | MumbaiDB | 2 | custIDMumbai
CustomerName | MumbaiDB | 2 | custNameMumbai
CustomerPhone | MumbaiDB | 2 | CustPhoneMumbai
这里我不需要任何客户数据,只需要来自两个数据库的列名列表以及数据库名称和 ID,
上面 table 中的 ColumnName
列是我给 db_ColumnNamme
为了简单起见,我以 2 个数据库和 3 个列为例,但是可以有 N 个数据库,每个数据库都有一个 table 同名(此处为 tbl_c
),固定编号列。
如有任何说明,请在评论中告诉我。
您似乎想要:
select t.colsname as ColumnName,
b.db_name as DataBaseName,
b.id as DataBaseID,
t.cols as db_ColumnNamme
from tbl_C c
cross apply (values ('custID', 'CustomerID'), ('custName', 'CustomerName'),
('CustPhone', 'CustomerPhone')
) t (cols, colsname)
inner join tbl_B b on b.id = c.custID;
如果我正确理解了您的问题,那么下面就是您正在寻找的解决方案。让我知道它是否适合你。
DECLARE @tblDatabaseName AS TABLE (Id INT, dbName VARCHAR(100))
--DROP TABLE #tmpREcord
INSERT INTO @tblDatabaseName(id,dbName) VALUES (1,'DelhiDB'),(1,'MumbaiDB')
DECLARE @SQL AS VARCHAR(8000)
DECLARE @Id INT
DECLARE @dbName AS VARCHAR(100)
CREATE TABLE #tmpRecord (
columnName VARCHAR(20),DBID INT, DatabaseName VARCHAR(100))
DECLARE cur_Traverse CURSOR FOR SELECT Id , dbName FROM @tblDatabaseName
OPEN cur_Traverse
FETCH NEXT FROM cur_Traverse INTO @id ,@dbName
WHILE @@FETCH_STATUS =0
BEGIN
SET @SQL = 'INSERT INTO #tmpRecord (ColumnName,DbId,DatabaseName )
SELECT name ,' + CONVERT(VARCHAR(10),@Id) + ' AS DBID, ''' + @dbName + ''' as dbname'
+ ' FROM ' + @dbName + '.sys.all_columns s
WHERE object_Id = (SELECT TOP(1) object_Id FROM ' + @dbName + '.sys.all_objects WHERE name=''tbl_C'')'
PRINT @SQL
EXECUTE (@SQL)
FETCH NEXT FROM cur_Traverse INTO @Id, @dbName
END
CLOSE cur_Traverse
DEALLOCATE cur_Traverse
SELECT * FROM #tmpRecord