从不同数据库中的 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     |

这里请注意两个数据库的列名可以不同

另请注意,DelhiDBMumbaiDB 是独立的数据库,每个数据库都有一个名为 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