你可以试试这个:
DECLARE @DataSource TABLE
(
[ID] INT IDENTITY (1,1)
,[Point1] INT
,[Point2] INT
,[Point3] INT
,[Point4] INT
,[Point5] INT
,[Point6] INT
,[Point7] INT
,[Point8] INT
,[Point9] INT
,[Point10] INT
,[Point11] INT
,[Point12] INT
);
INSERT INTO @DataSource ([Point1], [Point2], [Point3], [Point4], [Point5], [Point6], [Point7], [Point8], [Point9], [Point10], [Point11], [Point12])
VALUES (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
DECLARE @Limit TINYINT = 5;
UPDATE @DataSource
SET [Point1] = IIF(@Limit >= 1, 0, [Point1])
,[Point2] = IIF(@Limit >= 2, [Point1], [Point2])
,[Point3] = IIF(@Limit >= 3, [Point2], [Point3])
,[Point4] = IIF(@Limit >= 4, [Point3], [Point4])
,[Point5] = IIF(@Limit >= 5, [Point4], [Point5])
,[Point6] = IIF(@Limit >= 6, [Point5], [Point6])
,[Point7] = IIF(@Limit >= 7, [Point6], [Point7])
,[Point8] = IIF(@Limit >= 8, [Point7], [Point8])
,[Point9] = IIF(@Limit >= 9, [Point8], [Point9])
,[Point10] = IIF(@Limit >= 10, [Point9], [Point10])
,[Point11] = IIF(@Limit >= 11, [Point10], [Point11])
,[Point12] = IIF(@Limit >= 12, [Point11], [Point12])
SELECT *
FROM @DataSource;
另一种技术是使用动态 T-SQL 语句,以便仅更新您需要的列并排除此 IIF 语句。如果您在2012 下使用SQL Version,则必须将IIF 与CASE WHEN 语句切换:
UPDATE @DataSource
SET [Point1] = CASE WHEN @Limit >= 1 THEN 0 ELSE [Point1] END
,[Point2] = CASE WHEN @Limit >= 2 THEN [Point1] ELSE [Point2] END
,[Point3] = CASE WHEN @Limit >= 3 THEN [Point2] ELSE [Point3] END
,[Point4] = CASE WHEN @Limit >= 4 THEN [Point3] ELSE [Point4] END
,[Point5] = CASE WHEN @Limit >= 5 THEN [Point4] ELSE [Point5] END
,[Point6] = CASE WHEN @Limit >= 6 THEN [Point5] ELSE [Point6] END
,[Point7] = CASE WHEN @Limit >= 7 THEN [Point6] ELSE [Point7] END
,[Point8] = CASE WHEN @Limit >= 8 THEN [Point7] ELSE [Point8] END
,[Point9] = CASE WHEN @Limit >= 9 THEN [Point8] ELSE [Point9] END
,[Point10] = CASE WHEN @Limit >= 10 THEN [Point9] ELSE [Point10] END
,[Point11] = CASE WHEN @Limit >= 11 THEN [Point10] ELSE [Point11] END
,[Point12] = CASE WHEN @Limit >= 12 THEN [Point11] ELSE [Point12] END