Sql 为另一个数据库中的视图构建视图/表值UDF

Sql 为另一个数据库中的视图构建视图/表值UDF,sql,sql-server,stored-procedures,view,user-defined-functions,Sql,Sql Server,Stored Procedures,View,User Defined Functions,在不同的数据库中,我需要从中提取数据,共有10个视图。目前,我的团队正在向SQLEXEC命令传递一个字符串。我知道有更好的办法。本地数据库具有旧软件的数据,“不同”数据库具有新软件的数据。我们正在将两者结合起来。较新的软件还为具有相同结构的每个客户机/项目创建一个新的数据库 最理想的情况是,我希望在10个视图中的每一个视图上创建触发器,这些视图插入到本地数据库中已经存在的表中。我这里的问题是视图只能有而不是触发器,并且我需要在触发器之后有,这样DB仍能正常运行 我正在考虑的另一种方法是表值UDF

在不同的数据库中,我需要从中提取数据,共有10个视图。目前,我的团队正在向SQL
EXEC
命令传递一个字符串。我知道有更好的办法。本地数据库具有旧软件的数据,“不同”数据库具有新软件的数据。我们正在将两者结合起来。较新的软件还为具有相同结构的每个客户机/项目创建一个新的数据库

最理想的情况是,我希望在10个视图中的每一个视图上创建触发器,这些视图插入到本地数据库中已经存在的表中。我这里的问题是视图只能有
而不是
触发器,并且我需要在
触发器之后有
,这样DB仍能正常运行

我正在考虑的另一种方法是表值UDF。在这一点上,我最大的挫折是传统软件使用唯一ID,而新软件不使用唯一ID(对于我正在获取的字段)

有没有其他我看不到的方法或这些方法的任何改进

我将在下面发布一个伪示例- 我有一个数据库,其中有一个名为carparts的表(例如),以及一组使用该表的存储过程和视图。在另一个DB中,我有10个表,每个表表示一个汽车部件(发动机、消声器、座椅等),需要合并并使用类似于汽车部件表的表格。对于每个新的制造产品,建模软件都会为这10个表创建一个新的DB

现在我们正在做类似的事情

DECLARE @SQLCmd varchar(max) = '
    SELECT * FROM [''' + @DynamicTableName + '''].[dbo].[Engine] 
    UNION 
    SELECT * FROM [''' + @DynamicTableName + '''].[dbo].[Muffler]
    ... '
EXEC(@SQLCmd)

车内零件的ID可以是唯一的,而10个表中的ID可能不是唯一的,所以假设它们不能使用。

因此,我将在这里介绍我们的解决方案,以防一些可怜的灵魂最终遇到类似的情况。注意:这不是处理这个问题的唯一方法,只是我们决定使用的方法

我们最终创建了一个存储过程,从动态数据库的10个表中提取所有数据。该进程将所述数据插入临时表,临时表由“父”存储进程创建,该进程需要用于连接等的数据。这看起来像-

父存储过程

CREATE TABLE #DynamicData
( 
    ID UNIQUEIDENTIFIER,
    Name varchar(50),
    ...
)

EXEC GetDynamicData @Params=@Params

SELECT * FROM #DynamicData
    JOIN LocalTable on ...
DECLARE @DatabaseName varchar(50)

SELECT @DatabaseName = DatabaseName
    FROM Project A 
    JOIN Users U on A.UID=U.Project
    where U.EmailAddress = @CurrentUser

DECLARE @SQLCmd varchar(max)=
    'SELECT UID AS ID, Name ... FROM 
    (
        SELECT UID, Name, ... FROM [' + @DatabaseName + '].[dbo].[View1]
        UNION
        SELECT UID, Name, ... FROM [' + @DatabaseName + '].[dbo].[View2]
        UNION
        ...
    ) Items'

INSERT INTO #DynamicData EXEC @SQLCmd
子存储过程

CREATE TABLE #DynamicData
( 
    ID UNIQUEIDENTIFIER,
    Name varchar(50),
    ...
)

EXEC GetDynamicData @Params=@Params

SELECT * FROM #DynamicData
    JOIN LocalTable on ...
DECLARE @DatabaseName varchar(50)

SELECT @DatabaseName = DatabaseName
    FROM Project A 
    JOIN Users U on A.UID=U.Project
    where U.EmailAddress = @CurrentUser

DECLARE @SQLCmd varchar(max)=
    'SELECT UID AS ID, Name ... FROM 
    (
        SELECT UID, Name, ... FROM [' + @DatabaseName + '].[dbo].[View1]
        UNION
        SELECT UID, Name, ... FROM [' + @DatabaseName + '].[dbo].[View2]
        UNION
        ...
    ) Items'

INSERT INTO #DynamicData EXEC @SQLCmd

这样做的一大好处是,列在到达父存储过程时会“固化”。在Child中,它们只是字符串,因此没有任何建议、编译错误等。在Child中编辑内容可能会很痛苦,但只要您对要查找的列有明确的了解。

链接服务器?因此我们不需要链接服务器,因为所有数据库都在同一台服务器上。我忘了提到,新软件还使用动态数据库,因此我们将有多个代表多个客户机/项目的数据库。这就是为什么我们求助于EXEC中的字符串。我将把这一点添加到问题中。“动态数据库”:如果您事先不知道要从哪些数据库中选择,那么您将最终执行一些动态SQL。唯一的替代方法是在应用程序中而不是在数据库中组装SQL语句。为了减少重复相同代码的次数,您认为将动态SQL放在哪里最合适?例如,如果我有4或5个过程需要访问连接的动态SQL,我会尝试避免复制粘贴相同的代码。