我们有一个面额表,它存储每个唯一标识符关键字和每个面额的记录,因此任何给定的唯一标识符关键字最多可以有13行,用于指示面额达到该行内有7种不同的交易类型。我可以轻松地复制和粘贴下面的查询(这很好用)7次,每次都使用不同的SET和WHERE子句组合,但这看起来很乱,很长。使用IF语句更新字段的T-SQL动态更改字段
查询:
UPDATE #RecycleCashDenomsClone
SET startBal =
CASE
WHEN B.DenomType = '1.00' THEN A.d_01
WHEN B.DenomType = '2.00' THEN A.d_02
WHEN B.DenomType = '5.00' THEN A.d_05
WHEN B.DenomType = '10.00' THEN A.d_10
WHEN B.DenomType = '20.00' THEN A.d_20
WHEN B.DenomType = '50.00' THEN A.d_50
WHEN B.DenomType = '100.00' THEN A.d_100
WHEN B.DenomType = 'C0.01' THEN A.c_01
WHEN B.DenomType = 'C0.05' THEN A.c_05
WHEN B.DenomType = 'C0.10' THEN A.c_10
WHEN B.DenomType = 'C0.25' THEN A.c_25
WHEN B.DenomType = 'C0.50' THEN A.c_50
WHEN B.DenomType = 'C1.00' THEN A.c_100
END
FROM #VaultTotals A INNER JOIN #RecycleCashDenomsClone B ON A.importKey = B.importKey
WHERE A.identifier = 'D0510'
我会喜欢做...设置if语句改变@updatedField和@whereField(VARCHAR处理),以7点不同的组合,并将其传递到查询,如下所示:
UPDATE #RecycleCashDenomsClone
SET @updatedField =
CASE
WHEN B.DenomType = '1.00' THEN A.d_01
WHEN B.DenomType = '2.00' THEN A.d_02
WHEN B.DenomType = '5.00' THEN A.d_05
WHEN B.DenomType = '10.00' THEN A.d_10
WHEN B.DenomType = '20.00' THEN A.d_20
WHEN B.DenomType = '50.00' THEN A.d_50
WHEN B.DenomType = '100.00' THEN A.d_100
WHEN B.DenomType = 'C0.01' THEN A.c_01
WHEN B.DenomType = 'C0.05' THEN A.c_05
WHEN B.DenomType = 'C0.10' THEN A.c_10
WHEN B.DenomType = 'C0.25' THEN A.c_25
WHEN B.DenomType = 'C0.50' THEN A.c_50
WHEN B.DenomType = 'C1.00' THEN A.c_100
END
FROM #VaultTotals A INNER JOIN #RecycleCashDenomsClone B ON A.importKey = B.importKey
WHERE A.identifier = @whereField
不幸的是,这不起作用,没有错误信息,它只是不更新字段。如果可能的话,我想避免使用动态SQL,并且像上面提到的那样,我想避免使用不同的字段和where子句将此查询复制粘贴7次。
P.S.我测试了这两个变量varchar(10)并将它们设置为字符串。 ex./
DECLARE @updatedField VARCHAR(10) = 'startBal'
DECLARE @whereField VARCHAR(10) = 'D0510'
这是一个很好的开始。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –
我看不出如何避免动态sql在这里。 – scsimon
'UPDATE'与'SELECT'一样可以设置变量的值。这就是你的代码所做的。这不是“这不起作用,也不是错误信息”的情况,而是您没有预料到或检查的结果。这也是_optimistic programming_的一个例子:我希望它能做我想做的事情,例如'设置ColB = @ColName @Operator @ Constant'它应该知道前两个变量值应该被重新解释为源代码,但不是第三个。 – HABO