SQL Server如何隐藏SELECT子句中用于UPDATE计算的列
解决方案
方案1:插入时直接计算,完全省略该列(最优选择)
你不需要将[Betaling (brutto)]列放入INSERT的查询结果中,也无需单独编写UPDATE语句,直接在SELECT查询阶段就计算好[Oppdragsgebyr (netto)]的取值即可,一步完成操作,性能更高也没有多余逻辑:
CREATE PROCEDURE [dbo].[spGetTrips] @trips udtTripsPerMonth readonly AS BEGIN INSERT INTO dbo.tblTripsPerMonth(/* 此处列列表删除[Betaling (brutto)],保留[Oppdragsgebyr (netto)]即可 */) SELECT [KjøretøyID], MAX(SUBSTRING([År], 7, 4)), MAX(SUBSTRING([Måned], 4, 2)), SUM([Betaling (netto)]) AS [Betaling (netto)], SUM([Bestillingsgebyr (netto)]) AS [Bestillingsgebyr (netto)], SUM([Betalingsgebyr (netto)]) AS [Betalingsgebyr (netto)], VARP([OppdragsMVAkode]), MAX(CONCAT(LøyvehaverFakturaID, 'UF-' + SUBSTRING([År], 9, 2) + SUBSTRING([Måned], 4, 2))), -- 直接在此处计算目标字段值,无需后续UPDATE SUM([Betaling (brutto)]) * 8 / 100 AS [Oppdragsgebyr (netto)], VARP([OppdragsgebyrMVAkode]), MAX(CONCAT([RidelRegionFakturaID], 'UF-' + SUBSTRING([År], 9, 2) + SUBSTRING([Måned], 4, 2))) FROM @trips GROUP BY [KjøretøyID] END
该方案适合tblTripsPerMonth表本身不需要存储[Betaling (brutto)]字段的场景,是效率最高的写法。
方案2:表需存储该列,仅查询时隐藏
如果tblTripsPerMonth表确实需要保留[Betaling (brutto)]字段存储数据,仅在后续查询时不想展示该列,那么写查询语句时明确指定要返回的列,不要使用SELECT *即可:
-- 示例查询,列列表中剔除[Betaling (brutto)]即可 SELECT [KjøretøyID], [År], [Måned], [Betaling (netto)], [Bestillingsgebyr (netto)], [Betalingsgebyr (netto)], [OppdragsMVAkode], [LøyvehaverFakturaID], [Oppdragsgebyr (netto)], [OppdragsgebyrMVAkode], [RidelRegionFakturaID] FROM dbo.tblTripsPerMonth
注意:你原有代码中的UPDATE语句没有加WHERE条件,会更新表内所有行的
[Oppdragsgebyr (netto)]字段,若子查询返回多个值还会直接报错,建议优先选择方案1优化写法规避该问题。
内容的提问来源于stack exchange,提问作者Ole M
相关产品推荐
相关产品推荐

