如何同时更新多个表?

时间:2011-03-01 12:38:01

标签: tsql

我正在尝试更新三个不同表中的字段,但是我遇到了一些错误:

UPDATE 
  a, b, c
SET 
  a.Locked = 0, 
  b.Locked = 0, 
  c.Locked = 0, 
  a.LockedByUsername = 'zolomon', 
  b.LockedByUsername = 'zolomon', 
  c.LockedByUsername = 'zolomon', 
  a.LockedAt = CURRENT_TIMESTAMP, 
  b.LockedAt = CURRENT_TIMESTAMP, 
  c.LockedAt = CURRENT_TIMESTAMP
FROM 
  TableA AS a
  INNER JOIN TableB as b ON n.Objid = o.Objid
  INNER JOIN TableC as c ON n.Namnid = e.Namnid 
WHERE
  a.Namn1 = 'FirstName LastName' AND b.objektkod='SomeIdentifier'

错误:

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near ','.

4 个答案:

答案 0 :(得分:25)

您无法在单个update查询中更新多个表中的字段。你得到的错误是因为这是不允许的:

update a, b, c

由于您只能根据update命令更新一个表

答案 1 :(得分:4)

正如其他答案所指出的,在SQL中UPDATE只更新一个表。这通常足以满足大多数实际需求。如果您想同时更新多个表 ,您可以将更新放在一个事务中,效果通常是相同的。

如果您担心获取不同的时间戳(对于您的字段lockedAt),请首先查看您的数据库文档,以检查您的CURRENT_TIMESTAMP函数是否指的是事务的开始时间(例如{{3 }})。

答案 2 :(得分:3)

您无法在一个语句中更新多个表。一个选项是使用存储过程

答案 3 :(得分:-1)

我们可以像这样加入

来更新它
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="DM[@CT='REJECT']">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>