Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server TSQL-将不同来源的数据汇集在一起…重构PK和FKs_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

Sql server TSQL-将不同来源的数据汇集在一起…重构PK和FKs

Sql server TSQL-将不同来源的数据汇集在一起…重构PK和FKs,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我有多个办公室和一个中央总部。每个办公室都有自己的SQL Server 2008实例,因此每个办公室都有自己的数据集和自己的ID集 每个办事处都已将数据导入总部,并将数据存储在一组类似于以下内容的STAGING_表中 DECLARE @STAGING_COUNTRY TABLE ( Original_CountryID INT NOT NULL, OfficeID VARCHAR(10) NOT NULL, Data VARCHAR(200) NOT NULL ); DECLAR

我有多个办公室和一个中央总部。每个办公室都有自己的SQL Server 2008实例,因此每个办公室都有自己的数据集和自己的ID集

每个办事处都已将数据导入总部,并将数据存储在一组类似于以下内容的
STAGING_表中

DECLARE @STAGING_COUNTRY TABLE
(
  Original_CountryID INT NOT NULL, 
  OfficeID VARCHAR(10) NOT NULL,
  Data VARCHAR(200) NOT NULL
);

DECLARE @STAGING_CITY TABLE
(
  Original_CityID INT NOT NULL, 
  Original_CountryID_FK INT NOT NULL, 
  OfficeID VARCHAR(10) NOT NULL,
  OtherData VARCHAR(100) NOT NULL
);
STAGING\u COUNTRY
具有每行的原始ID(由于每个办公室在其
COUNTRY
表的第一行具有
ID=1
),并且还具有唯一的
OfficeID
值,该值与
原始\u CountryID
一起生成唯一值

STAGING\u CITY
还具有每行的原始
ID
,表示每个办公室的唯一
OfficeID
值,在本例中为FK to
CountryID
,(当然,在这一点上,我们提到了
原始的\u CountryID
。与办公室
ID
一起可以识别)

让我们添加一些虚拟行:

/* ADD DUMMY VALUES TO STAGING_COUNTRY */ 
INSERT INTO @STAGING_COUNTRY
(Original_CountryID, OfficeID, Data) VALUES  (1, 'Office1', 'USA')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (2, 'Office1', 'Canada')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (3, 'Office1', 'Japan')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (1, 'Office2', 'USA')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (1, 'Office2', 'Italy')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (3, 'Office2', 'Canada')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (3, 'Office3', 'Canada')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (2, 'Office3', 'France')

INSERT INTO @STAGING_COUNTRY (Original_CountryID, OfficeID, Data)
VALUES  (3, 'Office3', 'USA')



/* ADD DUMMY VALUES TO STAGING_CITY */  
INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK, OfficeID, OtherData) VALUES 
(1, 1, 'Office1', 'New York')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (2, 1, 'Office1', 'Vancouver')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (3, 1, 'Office1', 'Tokia')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (1, 2, 'Office2', 'New York')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (2, 2, 'Office2', 'Rome')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (3, 2, 'Office2', 'Vancouver')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (1, 3, 'Office3', 'Vancouver')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (2, 3, 'Office3', 'Paris')

INSERT INTO @STAGING_CITY (Original_CityID, Original_CountryID_FK,
OfficeID, OtherData) VALUES  (3, 3, 'Office3', 'New York')
中央总部希望从一个中央数据库运行报告,该数据库几乎包含从所有办公室复制的所有数据,但为了优化此报告数据库,我们需要对
STAGING_表
…进行一些改组,并重新组织
FINAL_表
中的数据,如下所示:

DECLARE @FINAL_COUNTRY TABLE
(
  CountryID INT IDENTITY PRIMARY KEY, 
  Original_CountryID INT NOT NULL, 
  OfficeID VARCHAR(10) NOT NULL,
  Data VARCHAR(200) NOT NULL
);

DECLARE @FINAL_CITY TABLE
(
  CityID INT IDENTITY PRIMARY KEY, 
  Original_CityID INT NOT NULL, 
  CountryID_FK INT NOT NULL, 
  OfficeID VARCHAR(10) NOT NULL,
  OtherData VARCHAR(100) NOT NULL
);
DECLARE @COUNTRY_xref TABLE          
( 
  country_xref_id INT IDENTITY(1,1) not null,
  CountryID INT not null,
  Stage_Country_id INT             
);          

DECLARE @CITY_xref TABLE          
(          
  city_xref_id INT IDENTITY(1,1) not null,
  CityID INT not null,           
  Stage_City_id INT not null        
);
DECLARE @FINAL_COUNTRY TABLE 
( 
  CountryID INT IDENTITY PRIMARY KEY, 
  Data VARCHAR(200) NOT NULL 
); 

DECLARE @FINAL_CITY TABLE 
( 
  CityID INT IDENTITY PRIMARY KEY, 
  CountryID_FK INT NOT NULL,
  OtherData VARCHAR(100) NOT NULL 
); 
问题:
应尽可能优化
FINAL_COUNTRY
FINAL_CITY
表以便于报告。这些报告将以T-SQL存储过程编写

问题:
重新组织
FINAL_表
的最佳方法是什么,以便每个记录都有一个真实的PK标识符(如原始
Office_表
),并更新每个FK以指向服务器级别的正确新创建的PK

注意:
请注意,暂存表和最终表都位于服务器上的同一个DB中。 此外,出于其他目的,我们仍需要在
FINAL_表上保留
OriginalID
s

目标:
这里的主要目标是重新组织成一组表,这些表可以很容易地为性能目的编制索引

如果需要,请询问更多信息


高级的许多感谢……/P> < P>这可能只是一个部分的答案。你可能想考虑在每个阶段表上设置一个通用身份ID。

DECLARE @STAGING_COUNTRY TABLE 
( 
  Stage_Country_id INT IDENTITY(1,1) NOT NULL,
  Original_CountryID INT NOT NULL,  
  OfficeID VARCHAR(10) NOT NULL, 
  Data VARCHAR(200) NOT NULL 
); 

DECLARE @STAGING_CITY TABLE 
( 
  Stage_City_id INT IDENTITY(1,1) NOT NULL,
  Original_CityID INT NOT NULL,  
  Original_CountryID_FK INT NOT NULL,  
  OfficeID VARCHAR(10) NOT NULL, 
  OtherData VARCHAR(100) NOT NULL 
); 
您的最终表格不应具有原始的_ID,因为每个城市/国家的表格中应该只有1条记录

然后,我想你需要一些交叉参考表格,将你的最终表格与你的舞台表格联系起来。看起来是这样的:

DECLARE @FINAL_COUNTRY TABLE
(
  CountryID INT IDENTITY PRIMARY KEY, 
  Original_CountryID INT NOT NULL, 
  OfficeID VARCHAR(10) NOT NULL,
  Data VARCHAR(200) NOT NULL
);

DECLARE @FINAL_CITY TABLE
(
  CityID INT IDENTITY PRIMARY KEY, 
  Original_CityID INT NOT NULL, 
  CountryID_FK INT NOT NULL, 
  OfficeID VARCHAR(10) NOT NULL,
  OtherData VARCHAR(100) NOT NULL
);
DECLARE @COUNTRY_xref TABLE          
( 
  country_xref_id INT IDENTITY(1,1) not null,
  CountryID INT not null,
  Stage_Country_id INT             
);          

DECLARE @CITY_xref TABLE          
(          
  city_xref_id INT IDENTITY(1,1) not null,
  CityID INT not null,           
  Stage_City_id INT not null        
);
DECLARE @FINAL_COUNTRY TABLE 
( 
  CountryID INT IDENTITY PRIMARY KEY, 
  Data VARCHAR(200) NOT NULL 
); 

DECLARE @FINAL_CITY TABLE 
( 
  CityID INT IDENTITY PRIMARY KEY, 
  CountryID_FK INT NOT NULL,
  OtherData VARCHAR(100) NOT NULL 
); 
您是否也在问加载/转换过程是什么样的,或者这更多是关于模式的

您的最终表格可能如下所示:

DECLARE @FINAL_COUNTRY TABLE
(
  CountryID INT IDENTITY PRIMARY KEY, 
  Original_CountryID INT NOT NULL, 
  OfficeID VARCHAR(10) NOT NULL,
  Data VARCHAR(200) NOT NULL
);

DECLARE @FINAL_CITY TABLE
(
  CityID INT IDENTITY PRIMARY KEY, 
  Original_CityID INT NOT NULL, 
  CountryID_FK INT NOT NULL, 
  OfficeID VARCHAR(10) NOT NULL,
  OtherData VARCHAR(100) NOT NULL
);
DECLARE @COUNTRY_xref TABLE          
( 
  country_xref_id INT IDENTITY(1,1) not null,
  CountryID INT not null,
  Stage_Country_id INT             
);          

DECLARE @CITY_xref TABLE          
(          
  city_xref_id INT IDENTITY(1,1) not null,
  CityID INT not null,           
  Stage_City_id INT not null        
);
DECLARE @FINAL_COUNTRY TABLE 
( 
  CountryID INT IDENTITY PRIMARY KEY, 
  Data VARCHAR(200) NOT NULL 
); 

DECLARE @FINAL_CITY TABLE 
( 
  CityID INT IDENTITY PRIMARY KEY, 
  CountryID_FK INT NOT NULL,
  OtherData VARCHAR(100) NOT NULL 
); 

如果您还没有,请继续阅读,在某些情况下,它们可以大大提高性能。