我需要从另一个数据库中获取约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可能不是唯一的,因此假定它们无法使用。
所以我将我们的解决方案放在这里,以防万一某个可怜的灵魂陷入类似的境地。注意:这不是处理此问题的唯一方法,而是我们决定使用的方法。
我们最终创建了一个存储的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中编辑内容可能很麻烦,但是只要您对要查找的列有明确的了解。] >