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