我有一个要更新的表,其中包含一个名为"expiration_days"的列。我正在做的是尝试使用"别名列"(不确定该怎么称呼它(来更新"expiration_days"列中的记录,该列是子查询的一部分,我在子查询中计算了用户密码过期的天数。要从子查询中获取值并在实际表中更新这些值的列称为"倒计时"。我将子查询结果命名为"query"(派生表(。到目前为止,我有这个:
UPDATE LOGIN_INFO
SET expiration_days = query.countdown
FROM (
select li.name as name, countdown = 365 - datediff(day, sl.pwdate, getdate())
from master..syslogins sl, LOGIN_INFO li
where li.name = sl.name) query
WHERE LOGIN_INFO.name = query.name
我遇到的问题是我得到了这个错误:您不能在UPDATE或DELETE语句的FROM子句中使用派生表(我还得到:子查询where子句上的'('附近的语法不正确(
有没有一种方法可以让我从select语句中的计算列中获取结果,并用一个查询或其他简单明了的方式更新LOGIN_INFO表中的列?
也许是类似的东西
update login_info
set expiration_days = (select 365 - datediff(day,s1.pwdate,getdate())
from master..syslogins s1
where s1.name = li.name)
from login_info li
where exists(select 1
from master..syslogins s2
where s2.name = li.name)
注意:
- 添加
exists()
子句是为了确保我们不会错误地更新login_info
中在syslogins
中不匹配的行,否则OP将需要相应地修改逻辑(即,如果syslogins
中不存在匹配行,则将expiration_days
设置为什么?( - 如果
syslogins.pwdate
是NULL(我目前无法访问正在运行的ASE实例(,那么OP将需要额外的逻辑来处理s1.pwdate
为NULL的场景;默认countdown
为某个硬编码值?或者可能修改CCD_ 9以包括附加子句CCD_