我有一个数据库说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 |
请注意,这两个数据库的列名称可能不同
另请注意,DelhiDB
和MumbaiDB
是单独的数据库,每个数据库都有一个名为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
),其中包含固定的列数。
如有任何澄清,请在评论中告诉我。
答案 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;