You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:18:03