e数据集名称,则现有SP中的代码如下所示: DECLARE @country VARCHAR(20) = 'USA' CREATE TABLE #tempHistory (country varchar(20), location_id int, location_description varchar(20)) DECLARE @sql VARCHAR(max) SET @sql = 'SELECT ''' + @country + ''' as country, location_id, location_description FROM [SERVER20].[Shop_' + @country + '].[dbo].[report_asset_history]' INSERT INTO #tempHistory EXEC (@sql) : : CREATE TABLE #AssetHistory ( location_ID int, location_Description varchar(100) ); INSERT INTO #AssetHistory EXEC spDataLoad @DataSet='AssetHistory', @Location=@Location; : : use the data set : CREATE TABLE #AssetDetails ( : : Specification for Asset Details table : ); INSERT INTO #AssetDetails EXEC spDataLoad @DataSet='AssetDetails', @Location=@Location; : : use the data set : CREATE PROCEDURE spDataLoad @DATASET varchar(20) , @LOCATION Varchar(50) AS BEGIN -- CANADA SECTION ------------------------------------ IF @LOCATION = 'CANADA' BEGIN IF @DATASET = 'AssetHistory' SELECT location_id, location_description FROM [SERVER20].[Shop_Canada].[dbo].[report_asset_history] ELSE IF @DATASET = 'AssetDetails' SELECT : Asset details data FROM [SERVER20].[Shop_Canada].[dbo].[report_asset_details] ELSE IF @DATASET = '....' : : Etc, Etc for CANADA SECTION END; -- USA SECTION ------------------------------------ IF @LOCATION = 'USA' BEGIN IF @DATASET = 'AssetHistory' SELECT location_id, location_description FROM [SERVER20].[Shop_USA].[dbo].[report_asset_history] ELSE IF @DATASET = 'AssetDetails' SELECT : Asset details data FROM [SERVER20].[Shop_USA].[dbo].[report_asset_details] ELSE IF @DATASET = '....' : : Etc, Etc for USA SECTION END; -- SOME OTHER SECTION --------------------------- IF @LOCATION = 'SOME OTHER' BEGIN : Same logic END RETURN 0; END
现在,假设您有另一个SP需要数据集“AssetDetails”,则代码如下:e数据集名称,则现有SP中的代码如下所示: DECLARE @country VARCHAR(20) = 'USA' CREATE TABLE #tempHistory (country varchar(20), location_id int, location_description varchar(20)) DECLARE @sql VARCHAR(max) SET @sql = 'SELECT ''' + @country + ''' as country, location_id, location_description FROM [SERVER20].[Shop_' + @country + '].[dbo].[report_asset_history]' INSERT INTO #tempHistory EXEC (@sql) : : CREATE TABLE #AssetHistory ( location_ID int, location_Description varchar(100) ); INSERT INTO #AssetHistory EXEC spDataLoad @DataSet='AssetHistory', @Location=@Location; : : use the data set : CREATE TABLE #AssetDetails ( : : Specification for Asset Details table : ); INSERT INTO #AssetDetails EXEC spDataLoad @DataSet='AssetDetails', @Location=@Location; : : use the data set : CREATE PROCEDURE spDataLoad @DATASET varchar(20) , @LOCATION Varchar(50) AS BEGIN -- CANADA SECTION ------------------------------------ IF @LOCATION = 'CANADA' BEGIN IF @DATASET = 'AssetHistory' SELECT location_id, location_description FROM [SERVER20].[Shop_Canada].[dbo].[report_asset_history] ELSE IF @DATASET = 'AssetDetails' SELECT : Asset details data FROM [SERVER20].[Shop_Canada].[dbo].[report_asset_details] ELSE IF @DATASET = '....' : : Etc, Etc for CANADA SECTION END; -- USA SECTION ------------------------------------ IF @LOCATION = 'USA' BEGIN IF @DATASET = 'AssetHistory' SELECT location_id, location_description FROM [SERVER20].[Shop_USA].[dbo].[report_asset_history] ELSE IF @DATASET = 'AssetDetails' SELECT : Asset details data FROM [SERVER20].[Shop_USA].[dbo].[report_asset_details] ELSE IF @DATASET = '....' : : Etc, Etc for USA SECTION END; -- SOME OTHER SECTION --------------------------- IF @LOCATION = 'SOME OTHER' BEGIN : Same logic END RETURN 0; END,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,现在,假设您有另一个SP需要数据集“AssetDetails”,则代码如下: DECLARE @country VARCHAR(20) = 'USA' CREATE TABLE #tempHistory (country varchar(20), location_id int, location_description varchar(20)) DECLARE @sql VARCHAR(max) SET @sql = 'SELECT ''' + @country + ''' as coun
DECLARE @country VARCHAR(20) = 'USA'
CREATE TABLE #tempHistory (country varchar(20), location_id int, location_description varchar(20))
DECLARE @sql VARCHAR(max)
SET @sql = 'SELECT ''' + @country + ''' as country, location_id, location_description FROM [SERVER20].[Shop_' + @country + '].[dbo].[report_asset_history]'
INSERT INTO #tempHistory EXEC (@sql)
:
:
CREATE TABLE #AssetHistory (
location_ID int,
location_Description varchar(100)
);
INSERT INTO #AssetHistory EXEC spDataLoad @DataSet='AssetHistory', @Location=@Location;
:
: use the data set
:
CREATE TABLE #AssetDetails (
:
: Specification for Asset Details table
:
);
INSERT INTO #AssetDetails EXEC spDataLoad @DataSet='AssetDetails', @Location=@Location;
:
: use the data set
:
CREATE PROCEDURE spDataLoad
@DATASET varchar(20)
, @LOCATION Varchar(50)
AS
BEGIN
-- CANADA SECTION ------------------------------------
IF @LOCATION = 'CANADA'
BEGIN
IF @DATASET = 'AssetHistory'
SELECT location_id, location_description
FROM [SERVER20].[Shop_Canada].[dbo].[report_asset_history]
ELSE IF @DATASET = 'AssetDetails'
SELECT
: Asset details data
FROM [SERVER20].[Shop_Canada].[dbo].[report_asset_details]
ELSE IF @DATASET = '....'
:
: Etc, Etc for CANADA SECTION
END;
-- USA SECTION ------------------------------------
IF @LOCATION = 'USA'
BEGIN
IF @DATASET = 'AssetHistory'
SELECT location_id, location_description
FROM [SERVER20].[Shop_USA].[dbo].[report_asset_history]
ELSE IF @DATASET = 'AssetDetails'
SELECT
: Asset details data
FROM [SERVER20].[Shop_USA].[dbo].[report_asset_details]
ELSE IF @DATASET = '....'
:
: Etc, Etc for USA SECTION
END;
-- SOME OTHER SECTION ---------------------------
IF @LOCATION = 'SOME OTHER'
BEGIN
: Same logic
END
RETURN 0;
END
存储过程spDataLoad对于每个位置都有多个部分,并根据请求的数据集进行单独的选择,可能如下所示:
DECLARE @country VARCHAR(20) = 'USA'
CREATE TABLE #tempHistory (country varchar(20), location_id int, location_description varchar(20))
DECLARE @sql VARCHAR(max)
SET @sql = 'SELECT ''' + @country + ''' as country, location_id, location_description FROM [SERVER20].[Shop_' + @country + '].[dbo].[report_asset_history]'
INSERT INTO #tempHistory EXEC (@sql)
:
:
CREATE TABLE #AssetHistory (
location_ID int,
location_Description varchar(100)
);
INSERT INTO #AssetHistory EXEC spDataLoad @DataSet='AssetHistory', @Location=@Location;
:
: use the data set
:
CREATE TABLE #AssetDetails (
:
: Specification for Asset Details table
:
);
INSERT INTO #AssetDetails EXEC spDataLoad @DataSet='AssetDetails', @Location=@Location;
:
: use the data set
:
CREATE PROCEDURE spDataLoad
@DATASET varchar(20)
, @LOCATION Varchar(50)
AS
BEGIN
-- CANADA SECTION ------------------------------------
IF @LOCATION = 'CANADA'
BEGIN
IF @DATASET = 'AssetHistory'
SELECT location_id, location_description
FROM [SERVER20].[Shop_Canada].[dbo].[report_asset_history]
ELSE IF @DATASET = 'AssetDetails'
SELECT
: Asset details data
FROM [SERVER20].[Shop_Canada].[dbo].[report_asset_details]
ELSE IF @DATASET = '....'
:
: Etc, Etc for CANADA SECTION
END;
-- USA SECTION ------------------------------------
IF @LOCATION = 'USA'
BEGIN
IF @DATASET = 'AssetHistory'
SELECT location_id, location_description
FROM [SERVER20].[Shop_USA].[dbo].[report_asset_history]
ELSE IF @DATASET = 'AssetDetails'
SELECT
: Asset details data
FROM [SERVER20].[Shop_USA].[dbo].[report_asset_details]
ELSE IF @DATASET = '....'
:
: Etc, Etc for USA SECTION
END;
-- SOME OTHER SECTION ---------------------------
IF @LOCATION = 'SOME OTHER'
BEGIN
: Same logic
END
RETURN 0;
END
要管理性能,您可能需要添加调用者可以指定的用于筛选的默认参数,并将WHERE子句添加到数据集选择中。由于每个SP都在寻找不同的数据,您可以使用另一种更激进的方法 这种方法要求将所有50个SP的所有data SELECT语句放在一个SP中,例如spDataLoad,它接受两个参数—数据集名称和位置。spDataLoad根据指定的数据集和位置选择数据,并将请求的数据返回给调用者 对于每个不同的数据集和位置组合,您仍然需要多个select语句,但至少所有内容都在一个SP中,并且对数据的更改不会影响所有50个SP。如果每个位置的表和数据相同,则可以将代码细分为多个部分,每个位置一个部分,除了与该位置对应的数据库名称之外,代码都相同 以上述代码为例,如果我们选择“AssetHistory”作为数据集名称,则现有SP中的代码如下所示:
DECLARE @country VARCHAR(20) = 'USA'
CREATE TABLE #tempHistory (country varchar(20), location_id int, location_description varchar(20))
DECLARE @sql VARCHAR(max)
SET @sql = 'SELECT ''' + @country + ''' as country, location_id, location_description FROM [SERVER20].[Shop_' + @country + '].[dbo].[report_asset_history]'
INSERT INTO #tempHistory EXEC (@sql)
:
:
CREATE TABLE #AssetHistory (
location_ID int,
location_Description varchar(100)
);
INSERT INTO #AssetHistory EXEC spDataLoad @DataSet='AssetHistory', @Location=@Location;
:
: use the data set
:
CREATE TABLE #AssetDetails (
:
: Specification for Asset Details table
:
);
INSERT INTO #AssetDetails EXEC spDataLoad @DataSet='AssetDetails', @Location=@Location;
:
: use the data set
:
CREATE PROCEDURE spDataLoad
@DATASET varchar(20)
, @LOCATION Varchar(50)
AS
BEGIN
-- CANADA SECTION ------------------------------------
IF @LOCATION = 'CANADA'
BEGIN
IF @DATASET = 'AssetHistory'
SELECT location_id, location_description
FROM [SERVER20].[Shop_Canada].[dbo].[report_asset_history]
ELSE IF @DATASET = 'AssetDetails'
SELECT
: Asset details data
FROM [SERVER20].[Shop_Canada].[dbo].[report_asset_details]
ELSE IF @DATASET = '....'
:
: Etc, Etc for CANADA SECTION
END;
-- USA SECTION ------------------------------------
IF @LOCATION = 'USA'
BEGIN
IF @DATASET = 'AssetHistory'
SELECT location_id, location_description
FROM [SERVER20].[Shop_USA].[dbo].[report_asset_history]
ELSE IF @DATASET = 'AssetDetails'
SELECT
: Asset details data
FROM [SERVER20].[Shop_USA].[dbo].[report_asset_details]
ELSE IF @DATASET = '....'
:
: Etc, Etc for USA SECTION
END;
-- SOME OTHER SECTION ---------------------------
IF @LOCATION = 'SOME OTHER'
BEGIN
: Same logic
END
RETURN 0;
END
现在,假设您有另一个SP需要数据集“AssetDetails”,则代码如下:
DECLARE @country VARCHAR(20) = 'USA'
CREATE TABLE #tempHistory (country varchar(20), location_id int, location_description varchar(20))
DECLARE @sql VARCHAR(max)
SET @sql = 'SELECT ''' + @country + ''' as country, location_id, location_description FROM [SERVER20].[Shop_' + @country + '].[dbo].[report_asset_history]'
INSERT INTO #tempHistory EXEC (@sql)
:
:
CREATE TABLE #AssetHistory (
location_ID int,
location_Description varchar(100)
);
INSERT INTO #AssetHistory EXEC spDataLoad @DataSet='AssetHistory', @Location=@Location;
:
: use the data set
:
CREATE TABLE #AssetDetails (
:
: Specification for Asset Details table
:
);
INSERT INTO #AssetDetails EXEC spDataLoad @DataSet='AssetDetails', @Location=@Location;
:
: use the data set
:
CREATE PROCEDURE spDataLoad
@DATASET varchar(20)
, @LOCATION Varchar(50)
AS
BEGIN
-- CANADA SECTION ------------------------------------
IF @LOCATION = 'CANADA'
BEGIN
IF @DATASET = 'AssetHistory'
SELECT location_id, location_description
FROM [SERVER20].[Shop_Canada].[dbo].[report_asset_history]
ELSE IF @DATASET = 'AssetDetails'
SELECT
: Asset details data
FROM [SERVER20].[Shop_Canada].[dbo].[report_asset_details]
ELSE IF @DATASET = '....'
:
: Etc, Etc for CANADA SECTION
END;
-- USA SECTION ------------------------------------
IF @LOCATION = 'USA'
BEGIN
IF @DATASET = 'AssetHistory'
SELECT location_id, location_description
FROM [SERVER20].[Shop_USA].[dbo].[report_asset_history]
ELSE IF @DATASET = 'AssetDetails'
SELECT
: Asset details data
FROM [SERVER20].[Shop_USA].[dbo].[report_asset_details]
ELSE IF @DATASET = '....'
:
: Etc, Etc for USA SECTION
END;
-- SOME OTHER SECTION ---------------------------
IF @LOCATION = 'SOME OTHER'
BEGIN
: Same logic
END
RETURN 0;
END
存储过程spDataLoad对于每个位置都有多个部分,并根据请求的数据集进行单独的选择,可能如下所示:
DECLARE @country VARCHAR(20) = 'USA'
CREATE TABLE #tempHistory (country varchar(20), location_id int, location_description varchar(20))
DECLARE @sql VARCHAR(max)
SET @sql = 'SELECT ''' + @country + ''' as country, location_id, location_description FROM [SERVER20].[Shop_' + @country + '].[dbo].[report_asset_history]'
INSERT INTO #tempHistory EXEC (@sql)
:
:
CREATE TABLE #AssetHistory (
location_ID int,
location_Description varchar(100)
);
INSERT INTO #AssetHistory EXEC spDataLoad @DataSet='AssetHistory', @Location=@Location;
:
: use the data set
:
CREATE TABLE #AssetDetails (
:
: Specification for Asset Details table
:
);
INSERT INTO #AssetDetails EXEC spDataLoad @DataSet='AssetDetails', @Location=@Location;
:
: use the data set
:
CREATE PROCEDURE spDataLoad
@DATASET varchar(20)
, @LOCATION Varchar(50)
AS
BEGIN
-- CANADA SECTION ------------------------------------
IF @LOCATION = 'CANADA'
BEGIN
IF @DATASET = 'AssetHistory'
SELECT location_id, location_description
FROM [SERVER20].[Shop_Canada].[dbo].[report_asset_history]
ELSE IF @DATASET = 'AssetDetails'
SELECT
: Asset details data
FROM [SERVER20].[Shop_Canada].[dbo].[report_asset_details]
ELSE IF @DATASET = '....'
:
: Etc, Etc for CANADA SECTION
END;
-- USA SECTION ------------------------------------
IF @LOCATION = 'USA'
BEGIN
IF @DATASET = 'AssetHistory'
SELECT location_id, location_description
FROM [SERVER20].[Shop_USA].[dbo].[report_asset_history]
ELSE IF @DATASET = 'AssetDetails'
SELECT
: Asset details data
FROM [SERVER20].[Shop_USA].[dbo].[report_asset_details]
ELSE IF @DATASET = '....'
:
: Etc, Etc for USA SECTION
END;
-- SOME OTHER SECTION ---------------------------
IF @LOCATION = 'SOME OTHER'
BEGIN
: Same logic
END
RETURN 0;
END
要管理性能,您可能需要为筛选添加默认参数,这些参数可以由调用者指定,并将WHERE子句添加到数据集选择中。您可以为每个位置使用动态sql,而不是为单个表中的列创建不同的数据库。那么您只需要一个where子句。当你添加一个新位置时,你不需要改变任何东西。您可以使用动态SQL:在VARCHAR变量中构建查询,然后使用EXEC或sp_executeSQL运行它。有关选项/差异,请参见例如,您的问题,因为您的一些数据被错误建模为元数据。也就是说,您希望能够查询的国家名称位于一个不可查询的位置(嵌入在数据库名称中)@JohnRC如果是这样的话,这真是一团糟……您可以使用动态sql,而不是为每个位置创建一个不同的数据库,使其成为单个表中的一列。那么您只需要一个where子句。当你添加一个新位置时,你不需要改变任何东西。您可以使用动态SQL:在VARCHAR变量中构建查询,然后使用EXEC或sp_executeSQL运行它。有关选项/差异,请参见例如,您的问题,因为您的一些数据被错误建模为元数据。也就是说,您希望能够查询的国家名称位于一个不可查询的位置(嵌入在数据库名称中)@JohnRC如果是这样的话,这确实是一个非常混乱的问题……假设位置与表名中的位置相同假设位置与表名中的位置相同这是一个非常好的解决方法,但真正的解决方案是将数据库结构更改为单个统一数据库,其中位置只是另一列。当然,这只是一种解决方法,我对更改数据库结构的可能性一无所知。除了修复基础数据库问题之外,这可能是处理此问题的最佳方法。当where子句应用于视图外部时,视图作为不同数据库中表的联合可能会对性能产生影响。在过滤掉不需要的行之前,你不会从两个数据库中加载所有数据吗?@JohnRC我只是在想同样的事情。实际上我更喜欢你的答案。:-)这是一个很好的解决方案,但真正的解决方案是将数据库结构更改为一个统一的数据库,其中位置只是另一列。当然,这只是一个解决方案,我对更改数据库结构的可能性一无所知。除了修复基础数据库问题之外,这可能是处理此问题的最佳方法。当where子句应用于视图外部时,视图作为不同数据库中表的联合可能会对性能产生影响。在过滤掉不需要的行之前,你不会从两个数据库中加载所有数据吗?@JohnRC我只是在想同样的事情。实际上我更喜欢你的答案。:-)这会起作用,但会使糟糕的数据设计永久化。一旦您不得不求助于动态sql并将部分sql语句存储在表中,很明显,这表明有些东西非常不可靠。我正在为他的问题提供解决方案,而不是告诉他们如何更改数据设计。无需防御性。是的,正如我所说,它是有效的。但那个数据设计真的很糟糕。伙计,我只是生活很糟糕…:-(这会起作用,但会使糟糕的数据设计永久化。一旦你不得不求助于动态sql并将部分sql语句存储在一个表中,很明显,这表明有些东西非常不合理。我正在为他的问题提供解决方案,而不是告诉他们如何更改数据设计。不需要防御性。是的,正如我所说的那样。但数据设计是可行的真的很糟糕。伙计,我只是生活很糟糕…:-(