在SQL Server中,我们有一个联结表,将我们的属性ID与几个外部数据库中相同属性的ID(文本或数字)相关联(对于没有链接,标记值为-1或“-1”):
SEPID SEPCODE AEID MRIID ABSID PEDID
2087 '140800' 26077 '140800' '-1' 3162
2088 '140900' -1 '140900' '-1' 3167
2089 'F21610' 25744 '-1' '-1' 3184
2090 '15402' -1 '-1' '-1' 3185
2094 '141200' 26085 '141200' '83296' 3198
随着数据库和业务需求的增长,我们编写新的特定函数来将一组ID转换为另一组ID,以逗号分隔的输入ID字符串列表并返回输出ID表或另一个以逗号分隔的输出列表ID,具有表值(TVF)与标量值(SVF)函数的不同用例。例如(使用硬编码而不是正常的以编程方式管理的ID列表):
SELECT * FROM dbo.tvf_SepIdsToAbsIds('2088,2090,2094')
SELECT * FROM dbo.tvf_MriInfo(dbo.svf_AeIds2MriIds('26077,25744'))
将返回:
ABSID
'-1'
'-1'
'83296'
和
MRIID NAME ETC...
'140800' 'Foo' ...
我想知道是否有一种合理,实用,合理的方式来替换这些激增的特定功能,只需要一个通用的TVF和SVF,它将带有两个列名和一个ID列表:
SELECT * FROM dbo.tvf_Ids('SEPID', '2088,2090,2094', 'ABSID')
SELECT * FROM dbo.MriInfo(dbo.svf_Ids('AEID', '26077,25744', 'MRIID'))
有可能吗?它需要动态SQL吗?有时文本/有时数字外部ID是否会使事情变得复杂化?这场斗争值得吗?动态SQL总是感觉有点狡猾,在这种情况下,我甚至不确定如何编写它。
答案 0 :(得分:0)
如果我理解你的问题,你就会拥有许多数据库,每个数据库都掌握一组ID。在您选择的数据库中,您将一些\所有这些与本地数据相关联。然后,您需要一种在本地\远程IDS之间进行转换的方法。
您可以使用同义词指向数据库,然后使用视图来使用您的同义词。
所以你会有
Select *
from MyNewView
并在你的MyNewView
中Select *
from MyNewSynonym s
inner join Mytable.ABSID = s.ABSID
您的本地数据只是查看视图,并且不了解有关不同数据库或任何特定转换问题的任何信息。它全部隐藏在同义词和视图中。
不确定为什么要使用TVF,但它们比使用SVF更好,因为性能原因你肯定要避免使用它们。如果你可以在视图中隐藏它,那就更好了,因为它可以为你提供索引优势。
至于拆分字符串并将它们转换为行集,您可以使用许多方法来执行此操作。包括TVF,CLR功能或一些可怕的循环。有很多例子可以帮助你。然后,您只需将结果与上面视图中的结果一起加入。