从不同数据库中的2个表中获取值到另一个表中

时间:2018-05-23 12:53:45

标签: sql sql-server database-cursor

我有一个数据库说MasterDB,其中包含表tbl_B中的某些数据库名称列表。每个数据库名称都由一个ID标识。 表tbl_B的结构类似于以下

tbl_B

ID | DB_Name
-------------
1  | DelhiDB
2  | MumbaiDB

有一些名称相同的数据库,即DelhiDB和MumbaiDB,每个数据库都有一个名为tbl_C的表,其中包含一些数据,例如。

德里的

tbl_C

custIDDelhi | custNameDelhi | CustPhoneDelhi |
----------------------------------------------
     1      | John          |     123456     |
     2      | Monika        |     789945     |

请注意,这两个数据库的列名称可能不同

另请注意,DelhiDBMumbaiDB是单独的数据库,每个数据库都有一个名为tbl_C的表

我想在tblCusotmer_Dictionary

中创建一个名为MasterDB的表格

使用类似这样的数据

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, 上表中的列ColumnName是我为列db_ColumnNamme提供的通用名称

为简单起见,我已经为2个数据库和3个列提供了示例但是对于数据库可以有N个数字,每个数据库都有一个具有相同名称的表(此处为tbl_c),其中包含固定的列数。 如有任何澄清,请在评论中告诉我。

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,那么下面是您正在寻找的解决方案。让我知道它是否适合你。

  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

答案 1 :(得分:0)

您似乎想要:

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;