Получить значения из 2 таблиц в разных базах данных в другую таблицу - PullRequest
0 голосов
/ 23 мая 2018

У меня есть база данных, скажем, MasterDB, в которой есть список некоторых имен баз данных в таблице tbl_B. Каждое имя базы данных идентифицируется идентификатором.Структура таблицы tbl_B подобна следующейТаблица с именем tbl_C, которая будет содержать некоторые данные, например:

tbl_C для Дели

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

Обратите внимание, что имена столбцов дляОбе базы данных могут быть разными

Также обратите внимание, что DelhiDB и MumbaiDB - это отдельные базы данных, каждая из которых имеет таблицу с именем tbl_C

Iхочу создать таблицу с именем 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

Здесь я не хочу никаких данных о клиентах, просто список имен столбцов из обеих баз данныхнаряду с именем и идентификатором базы данных, столбец ColumnName в приведенной выше таблице представляет собой общее имя, которое я даю столбцу db_ColumnNamme

. Я взял пример для 2 баз данных и 3 столбцов для простоты.может быть N числом для баз данных, каждая из которых имеет таблицу сто же имя (tbl_c здесь) с фиксированным количеством столбцов.Дайте мне знать в комментариях для любых разъяснений.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

если я правильно понял ваш вопрос, то ниже приведено решение, которое вы ищете.Дайте мне знать, если это работает для вас.

  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
0 голосов
/ 23 мая 2018

Вы, кажется, хотите:

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; 
...