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

问题描述 投票:-1回答:1

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

最理想的是,我想在插入本地数据库中现有表的10个视图中的每个视图上创建触发器。我的问题是视图只能具有INSTEAD OF触发器,而我需要AFTER触发器,以便DB仍能正常执行。

我正在考虑的另一种方法是表值UDF。我对此最大的挫败是,旧版软件使用唯一的ID,而新版软件则不使用(对于我要提取的字段)。

我还有其他看不到的方式或对这些方法有任何改进吗?

我将在下面发布一个伪示例-我有一个DB,其中包含一个名为car-parts的表,以及一堆使用该表的存储过程和视图。在另一个数据库中,我有10个表,每个表代表一个汽车零件(引擎,消音器,座椅等),需要进行合并和使用,类似于汽车零件表。对于每个新的制造产品,建模软件都会为这10个表创建一个新的数据库。

目前,我们正在执行类似的操作

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

汽车零件中的ID可以是唯一的,而10个表中的ID可能不是唯一的,因此假定它们无法使用。

sql sql-server stored-procedures view user-defined-functions
1个回答
0
投票

所以我将我们的解决方案放在这里,以防万一某个可怜的灵魂陷入类似的境地。注意:这不是处理此问题的唯一方法,而是我们决定使用的方法。

我们最终创建了一个存储的proc,以从动态DB上的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

这样做的最大好处是,当它们到达父级存储过程时,这些列已“固化”。在Child中,它们只是字符串,因此没有建议,编译错误等。在Child中编辑内容可能很麻烦,但是只要您对要查找的列有明确的了解。] >

© www.soinside.com 2019 - 2024. All rights reserved.