SQL Server+MS Access 是否需为录入/只读表单分设视图
完全不需要给每个业务实体维护两套视图,你现在的核心问题是把格式化逻辑放在了SQL层,同时没处理好多表JOIN视图在Access里的主键识别问题,按下面的方案调整就行,维护量能降很多。
推荐实现方案
方案1:单可更新视图 + 前端格式化(最优选择)
这是性能最好、维护成本最低的做法,核心思路是把数据存取和展示格式拆开:
- SQL端只建一个视图,返回所有需要的原始值、关联字段,不要做任何转字符串的格式化操作:
CREATE VIEW v_PurchaseOrderLines AS SELECT pod.PurchaseOrderDetailID, pod.PurchaseOrderID, p.ProductName, pod.ProductID, pod.Config, pod.ListPrice, pod.CurrencyID, pod.Quantity, pod.Discount, pod.UnitPrice, pod.UnitPrice * pod.Quantity AS TotalPrice, pod.VAT, pod.UnitPrice * pod.Quantity * (1 + pod.VAT) AS TotalPriceVAT, pod.ExpectedDelivery, pod.Notes FROM tbl1PurchaseOrderDetails pod INNER JOIN tbl1Products p ON pod.ProductID = p.ProductID;
注意视图里一定要带上明细表的主键PurchaseOrderDetailID,把这个视图链接到Access之后,在Access侧的链接视图设计界面里,手动把PurchaseOrderDetailID设置为主键——你之前觉得带JOIN的视图不能编辑,90%的原因是Access没自动识别到主键,直接把整个视图标记成只读了,手动指定主键之后,针对采购订单明细表字段的增删改操作都能正常回写SQL Server,完全满足编辑表单的需求。
- 所有货币、百分比的展示格式化全部放在Access前端做:不管是窗体还是报表,直接给对应数值控件设置格式即可,需要根据币种动态切换格式的话,写个几行的VBA通用函数,根据当前记录的
CurrencyID动态给控件设置格式属性就行。输入的时候控件绑定原始数值字段,显示的时候自动按对应币种、百分比规则渲染,比在SQL端调用标量函数转字符串性能高一个量级,后续调整格式也不用改数据库对象。
方案2:保留服务端格式化逻辑的单视图方案
如果你确实不想在前端写格式化逻辑,也不用拆两个视图,只要在同一个视图里同时保留原始可编辑字段和格式化后的展示字段即可:
- 视图里保留所有原始数值字段、主键、关联查询字段,保证视图基础可更新
- 额外增加你需要的格式化字符串列,这类列在Access里会自动识别为只读,不会影响其他原始字段的编辑
- 编辑表单里,输入控件绑定原始数值字段,展示用的控件绑定格式化后的字符串列即可
要注意你现在写的DisplayCurrencyFormat标量函数性能很差,哪怕是SQL Server 2019支持标量函数内联,带FORMAT的函数调用在数据量大的时候查询速度会明显变慢,非必要不建议在SQL层做这类展示用的格式化。
按这个方式调整之后,所有业务实体只需要建一个视图就够了,后续加字段、改逻辑只需要维护一个对象,不用再同步改两套视图。
内容的提问来源于stack exchange,提问作者ThomassoCZ
相关产品推荐
相关产品推荐

