UPDATE (Transact-SQL)UPDATE (Transact-SQL)

適用対象: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

SQL ServerSQL Server のテーブルまたはビュー内の既存のデータを変更します。Changes existing data in a table or view in SQL ServerSQL Server. 例については、「」を参照してください。For examples, see Examples.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

-- Syntax for SQL Server and Azure SQL Database  

[ WITH <common_table_expression> [...n] ]  
UPDATE   
    [ TOP ( expression ) [ PERCENT ] ]   
    { { table_alias | <object> | rowset_function_limited   
         [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]  
      }  
      | @table_variable      
    }  
    SET  
        { column_name = { expression | DEFAULT | NULL }  
          | { udt_column_name.{ { property_name = expression  
                                | field_name = expression }  
                                | method_name ( argument [ ,...n ] )  
                              }  
          }  
          | column_name { .WRITE ( expression , @Offset , @Length ) }  
          | @variable = expression  
          | @variable = column = expression  
          | column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression  
          | @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression  
          | @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression  
        } [ ,...n ]   
  
    [ <OUTPUT Clause> ]  
    [ FROM{ <table_source> } [ ,...n ] ]   
    [ WHERE { <search_condition>   
            | { [ CURRENT OF   
                  { { [ GLOBAL ] cursor_name }   
                      | cursor_variable_name   
                  }   
                ]  
              }  
            }   
    ]   
    [ OPTION ( <query_hint> [ ,...n ] ) ]  
[ ; ]  
  
<object> ::=  
{   
    [ server_name . database_name . schema_name .   
    | database_name .[ schema_name ] .   
    | schema_name .  
    ]  
    table_or_view_name}  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

UPDATE [ database_name . [ schema_name ] . | schema_name . ] table_name   
SET { column_name = { expression | NULL } } [ ,...n ]  
[ FROM from_clause ]  
[ WHERE <search_condition> ]   
[ OPTION ( LABEL = label_name ) ]  
[;]  

引数Arguments

WITH <common_table_expression>WITH <common_table_expression>
UPDATE ステートメントのスコープ内で定義された、一時的な名前付き結果セットまたはビュー (共通テーブル式 (CTE) とも呼ばれる) を指定します。Specifies the temporary named result set or view, also known as common table expression (CTE), defined within the scope of the UPDATE statement. CTE 結果セットは単純なクエリから派生し、UPDATE ステートメントで参照されます。The CTE result set is derived from a simple query and is referenced by UPDATE statement.

共通テーブル式は、SELECT、INSERT、DELETE、CREATE VIEW の各ステートメントでも使用できます。Common table expressions can also be used with the SELECT, INSERT, DELETE, and CREATE VIEW statements. 詳細については、「WITH common_table_expression (Transact-SQL)」を参照してください。For more information, see WITH common_table_expression (Transact-SQL).

TOP ( expression ) [ PERCENT ]TOP ( expression) [ PERCENT ]
更新する行の数または比率 (%) を指定します。Specifies the number or percent of rows that are updated. expression は行数または行の比率 (%) にすることができます。expression can be either a number or a percent of the rows.

INSERT、UPDATE、または DELETE を使用する TOP 式で参照される行は、順序付けされません。The rows referenced in the TOP expression used with INSERT, UPDATE, or DELETE are not arranged in any order.

INSERT、UPDATE、DELETE の各ステートメントで TOP を使用する場合は、expression を区切るかっこが必要です。Parentheses delimiting expression in TOP are required in INSERT, UPDATE, and DELETE statements. 詳細については、「TOP (Transact-SQL)」を参照してください。For more information, see TOP (Transact-SQL).

table_aliastable_alias
FROM 句で指定される別名です。行を更新するテーブルまたはビューを表します。The alias specified in the FROM clause representing the table or view from which the rows are to be updated.

server_nameserver_name
テーブルまたはビューがあるサーバー名 (リンクされたサーバー名またはサーバー名として OPENDATASOURCE 関数を使用) です。Is the name of the server (using a linked server name or the OPENDATASOURCE function as the server name) on which the table or view is located. server_name が指定されている場合、database_nameschema_name が必要です。If server_name is specified, database_name and schema_name are required.

database_namedatabase_name
データベースの名前です。Is the name of the database.

schema_nameschema_name
テーブルまたはビューが属するスキーマの名前を指定します。Is the name of the schema to which the table or view belongs.

table_or_view_nametable_or_view_name
行を更新するテーブルまたはビューの名前です。Is the name of the table or view from which the rows are to be updated. table_or_view_name によって参照されるビューは更新可能であることが必要です。また、そのビューの FROM 句ではベース テーブルを 1 つだけ参照している必要があります。The view referenced by table_or_view_name must be updatable and reference exactly one base table in the FROM clause of the view. 更新可能なビューの詳細については、「CREATE VIEW (Transact-SQL)」を参照してください。For more information about updatable views, see CREATE VIEW (Transact-SQL).

rowset_function_limitedrowset_function_limited
プロバイダーの機能によって、 OPENQUERY 関数または OPENROWSET 関数のいずれかになります。Is either the OPENQUERY or OPENROWSET function, subject to provider capabilities.

WITH ( <Table_Hint_Limited> )WITH ( <Table_Hint_Limited> )
対象のテーブルに設定可能なテーブル ヒントを 1 つ以上指定します。Specifies one or more table hints that are allowed for a target table. キーワード WITH とかっこが必要です。The WITH keyword and the parentheses are required. NOLOCK および READUNCOMMITTED は指定できません。NOLOCK and READUNCOMMITTED are not allowed. テーブル ヒントの詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。For information about table hints, see Table Hints (Transact-SQL).

@table_variable@table_variable
table 変数をテーブル ソースとして指定します。Specifies a table variable as a table source.

SETSET
更新する列名または変数名の一覧を指定します。Specifies the list of column or variable names to be updated.

column_namecolumn_name
変更するデータを含む列です。Is a column that contains the data to be changed. column_nametable_or view_name 内に存在する必要があります。column_name must exist in table_or view_name. ID 列は更新できません。Identity columns cannot be updated.

式 (expression)expression
変数、リテラル値、式、または 1 つの値を返すかっこで囲んだサブセレクト ステートメントです。Is a variable, literal value, expression, or a subselect statement (enclosed with parentheses) that returns a single value. expression で返される値で column_name または @variable の既存の値が置き換えられます。The value returned by expression replaces the existing value in column_name or @variable.

注意

Unicode 文字データ型 ncharnvarcharntext を参照している場合は、'expression' の前に大文字の 'N' を付ける必要があります。When referencing the Unicode character data types nchar, nvarchar, and ntext, 'expression' should be prefixed with the capital letter 'N'. 'N' が指定されていない場合、SQL ServerSQL Server では、文字列はデータベースまたは列の既定の照合順序に対応するコード ページに変換されます。If 'N' is not specified, SQL ServerSQL Server converts the string to the code page that corresponds to the default collation of the database or column. 文字列がこのコード ページにない場合は、失われます。Any characters not found in this code page are lost.

DEFAULTDEFAULT
列に格納された値を列に定義された既定値で置き換えることを指定します。Specifies that the default value defined for the column is to replace the existing value in the column. 列に既定値が定義されておらず、NULL 値が許されている場合は、この句を使用して列を NULL に変更できます。This can also be used to change the column to NULL if the column has no default and is defined to allow null values.

{ += | -= | *= | /= | %= | &= | ^= | |= }{ += | -= | *= | /= | %= | &= | ^= | |= }
複合代入演算子です。Compound assignment operator:
+= 加算して、割り当てる+= Add and assign
-= 減算して代入-= Subtract and assign
*= 乗算して代入*= Multiply and assign
/= 除算して代入/= Divide and assign
%= 剰余を代入%= Modulo and assign
&= ビットごとの AND 演算を行って代入&= Bitwise AND and assign
^= ビットごとの XOR と割り当て^= Bitwise XOR and assign
|= ビットごとの OR と割り当て|= Bitwise OR and assign

udt_column_nameudt_column_name
ユーザー定義型の列です。Is a user-defined type column.

property_name | field_nameproperty_name | field_name
ユーザー定義型のパブリック プロパティまたはパブリック データ メンバーです。Is a public property or public data member of a user-defined type.

method_name ( argument [ , ... n] )method_name ( argument [ ,... n] )
1 つ以上の引数を使用する udt_column_name の静的でないパブリック ミューテーター メソッドです。Is a nonstatic public mutator method of udt_column_name that takes one or more arguments.

. WRITE ( expression , @Offset , @Length ). WRITE (expression,@Offset,@Length)
column_name の値のセクションを変更することを指定します。Specifies that a section of the value of column_name is to be modified. expressioncolumn_name の @Offset から始まる @Length 単位が置き換えられます。expression replaces @Length units starting from @Offset of column_name. varchar(max)nvarchar(max)varbinary(max) の列だけこの句で指定できます。Only columns of varchar(max), nvarchar(max), or varbinary(max) can be specified with this clause. column_name では NULL 値は許容されません。また、テーブル名やテーブル別名で修飾することもできません。column_name cannot be NULL and cannot be qualified with a table name or table alias.

expressioncolumn_name にコピーされる値です。expression is the value that is copied to column_name. expression は、column_name 型に評価されるか、この型に暗黙的にキャストできる必要があります。expression must evaluate to or be able to be implicitly cast to the column_name type. expression に NULL が設定されている場合、@Length は無視され、column_name 内の値は指定された @Offset で切り捨てられます。If expression is set to NULL, @Length is ignored, and the value in column_name is truncated at the specified @Offset.

@Offset は、expression が書き込まれる、column_name の値の開始位置です。@Offset is the starting point in the value of column_name at which expression is written. @Offset は、0 から始まる序数の位置です。bigint で、負の数は指定できません。 @Offset is a zero-based ordinal position, is bigint, and cannot be a negative number. @Offset が NULL の場合、更新操作により expression は既存の column_name 値の最後に追加され、@Length は無視されます。If @Offset is NULL, the update operation appends expression at the end of the existing column_name value and @Length is ignored. @Offset が column_name 値の長さよりも大きい場合は、データベース エンジンDatabase Engine によってエラーが返されます。If @Offset is greater than the length of the column_name value, the データベース エンジンDatabase Engine returns an error. Offset と @Length の和が列の基になる値の終点を超える場合、値の最後の文字までが削除されます。If @Offset plus @Length exceeds the end of the underlying value in the column, the deletion occurs up to the last character of the value. @Offset と LEN(expression) の和が宣言された基になるサイズを超える場合、エラーが発生します。If @Offset plus LEN(expression) is greater than the underlying declared size, an error is raised.

@Length は列内のセクションの長さです。このセクションは @Offset から始まり、expression で置き換えられます。@Length is the length of the section in the column, starting from @Offset, that is replaced by expression. @Lengthbigint で、負の数は指定できません。 @Length is bigint and cannot be a negative number. @Length が NULL の場合、更新操作により column_name の値の @Offset から最後までのすべてのデータが削除されます。If @Length is NULL, the update operation removes all data from @Offset to the end of the column_name value.

詳細については、「解説」を参照してください。For more information, see Remarks.

@ variable@ variable
expression で返される値を設定する、宣言された変数です。Is a declared variable that is set to the value returned by expression.

SET @ variable = column = expression は、列と同じ値に変数を設定します。SET @variable = column = expression sets the variable to the same value as the column. 一方、SET @ variable = column, column = expression は、列の更新前の値に変数を設定します。This differs from SET @variable = column, column = expression, which sets the variable to the pre-update value of the column.

<OUTPUT_Clause><OUTPUT_Clause>
更新されたデータまたはそれに基づく式を、UPDATE 操作の一部として返します。Returns updated data or expressions based on it as part of the UPDATE operation. OUTPUT 句は、リモート テーブルまたはリモート ビューを対象とした DML ステートメントではサポートされません。The OUTPUT clause is not supported in any DML statements that target remote tables or views. 詳細については、「OUTPUT 句 (Transact-SQL)」を参照してください。For more information, see OUTPUT Clause (Transact-SQL).

FROM <table_source>FROM <table_source>
別のテーブル、ビュー、または派生テーブルのソースを使用して更新操作の基になる値を提供することを指定します。Specifies that a table, view, or derived table source is used to provide the criteria for the update operation. 詳細については、「FROM (Transact-SQL)」を参照してください。For more information, see FROM (Transact-SQL).

更新対象のオブジェクトが FROM 句で指定されたオブジェクトと同じで、FROM 句にそのオブジェクトへの参照が 1 つしかない場合、オブジェクトの別名は指定しても指定しなくてもかまいません。If the object being updated is the same as the object in the FROM clause and there is only one reference to the object in the FROM clause, an object alias may or may not be specified. 更新対象のオブジェクトが FROM 句に 2 つ以上含まれている場合、そのオブジェクトへの単独の参照でテーブルの別名を指定してはなりません。If the object being updated appears more than one time in the FROM clause, one, and only one, reference to the object must not specify a table alias. FROM 句にあるオブジェクトへの他のすべての参照に、オブジェクトの別名を含める必要があります。All other references to the object in the FROM clause must include an object alias.

INSTEAD OF UPDATE トリガーを伴うビューは、FROM 句を伴う UPDATE の対象にはなりません。A view with an INSTEAD OF UPDATE trigger cannot be a target of an UPDATE with a FROM clause.

注意

FROM 句での OPENDATASOURCE、OPENQUERY、または OPENROWSET の呼び出しは、更新の対象として使用されるこれらの関数の呼び出しとは別に評価されます。これは、両方の呼び出しに同じ引数が指定されている場合にも当てはまります。Any call to OPENDATASOURCE, OPENQUERY, or OPENROWSET in the FROM clause is evaluated separately and independently from any call to these functions used as the target of the update, even if identical arguments are supplied to the two calls. 特に、いずれか一方の呼び出しの結果に適用されるフィルター条件または結合条件は、もう一方の結果に影響しません。In particular, filter or join conditions applied on the result of one of those calls have no effect on the results of the other.

WHEREWHERE
更新する行を制限する条件を指定します。Specifies the conditions that limit the rows that are updated. WHERE 句で使用される形式に基づいて、更新には 2 種類の形式があります。There are two forms of update based on which form of the WHERE clause is used:

  • 検索更新では、削除する行を識別する検索条件を指定します。Searched updates specify a search condition to qualify the rows to delete.

  • 位置指定更新では、CURRENT OF 句を使用してカーソルを指定します。Positioned updates use the CURRENT OF clause to specify a cursor. 更新操作は、カーソルの現在位置で行われます。The update operation occurs at the current position of the cursor.

<search_condition><search_condition>
更新の対象となる行の条件を指定します。Specifies the condition to be met for the rows to be updated. 検索条件を結合の基準条件にすることもできます。The search condition can also be the condition upon which a join is based. 検索条件に含まれる述語の数に制限はありません。There is no limit to the number of predicates that can be included in a search condition. 述語と検索条件の詳細については、「検索条件 (Transact-SQL)」を参照してください。For more information about predicates and search conditions, see Search Condition (Transact-SQL).

CURRENT OFCURRENT OF
指定したカーソルの現在位置で更新を行うことを指定します。Specifies that the update is performed at the current position of the specified cursor.

WHERE CURRENT OF 句を使用する位置指定更新では、カーソルの現在位置にある 1 行を更新します。A positioned update using a WHERE CURRENT OF clause updates the single row at the current position of the cursor. 位置指定更新は、WHERE <search_condition> 句を使用して更新する行を識別する検索更新よりも正確です。This can be more accurate than a searched update that uses a WHERE <search_condition> clause to qualify the rows to be updated. 検索更新は、検索条件が特定の行を識別しない場合に複数の行を変更します。A searched update modifies multiple rows when the search condition does not uniquely identify a single row.

GLOBALGLOBAL
cursor_name でグローバル カーソルを参照することを指定します。Specifies that cursor_name refers to a global cursor.

cursor_namecursor_name
フェッチが行われる、開いているカーソルの名前です。Is the name of the open cursor from which the fetch should be made. cursor_name という名前のグローバル カーソルとローカル カーソルの両方がある場合、GLOBAL を指定すると、この引数はグローバル カーソルを参照します。GLOBAL を指定しないと、この引数はローカル カーソルを参照します。If both a global and a local cursor with the name cursor_name exist, this argument refers to the global cursor if GLOBAL is specified; otherwise, it refers to the local cursor. カーソルは、更新可能である必要があります。The cursor must allow updates.

cursor_variable_namecursor_variable_name
カーソル変数の名前を指定します。Is the name of a cursor variable. cursor_variable_name は、更新可能なカーソルを参照する必要があります。cursor_variable_name must reference a cursor that allows updates.

OPTION ( <query_hint> [ , ... n ] )OPTION ( <query_hint> [ ,... n ] )
オプティマイザー ヒントを使用して、データベース エンジンDatabase Engineがステートメントを処理する方法をカスタマイズすることを指定します。Specifies that optimizer hints are used to customize the way the データベース エンジンDatabase Engine processes the statement. 詳細については、「クエリ ヒント (Transact-SQL)」を参照してください。For more information, see Query Hints (Transact-SQL).

ベスト プラクティスBest Practices

@@ROWCOUNT 関数を使用して、クライアント アプリケーションに挿入される行数を返します。Use the @@ROWCOUNT function to return the number of inserted rows to the client application. 詳細については、「@@ROWCOUNT (Transact-SQL)」を参照してください。For more information, see @@ROWCOUNT (Transact-SQL).

影響を受ける古い値と新しい値を示すために、UPDATE ステートメントの中で変数名を使用することは可能です。ただし、これは UPDATE ステートメントによって影響を受けるのが単一のレコードである場合のみに限定されています。Variable names can be used in UPDATE statements to show the old and new values affected, but this should be used only when the UPDATE statement affects a single record. UPDATE ステートメントで複数のレコードが影響を受ける場合に、各レコードの古い値と新しい値を返すためには、OUTPUT 句を使用してください。If the UPDATE statement affects multiple records, to return the old and new values for each record, use the OUTPUT clause.

FROM 句を指定して更新操作の条件を設定するときは注意が必要です。Use caution when specifying the FROM clause to provide the criteria for the update operation. ステートメントには、1 つだけを重視する方法は対象の各列が更新されるとするかどうか、UPDATE ステートメントでは決定的であるに使用できるように指定されていない FROM 句が含まれている場合、UPDATE ステートメントの結果は未定義です。The results of an UPDATE statement are undefined if the statement includes a FROM clause that is not specified in such a way that only one value is available for each column occurrence that is updated, that is if the UPDATE statement is not deterministic. たとえば、次のスクリプトの UPDATE ステートメントでは、Table1 のどちらの行も UPDATE ステートメントの FROM 句の条件を満たしています。ただし、Table1 のどちらの行を使用して Table2. の行を更新するかは未定義です。For example, in the UPDATE statement in the following script, both rows in Table1 meet the qualifications of the FROM clause in the UPDATE statement; but it is undefined which row from Table1 is used to update the row in Table2.

USE AdventureWorks2012;  
GO  
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL  
    DROP TABLE dbo.Table1;  
GO  
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT NULL  
    DROP TABLE dbo.Table2;  
GO  
CREATE TABLE dbo.Table1   
    (ColA int NOT NULL, ColB decimal(10,3) NOT NULL);  
GO  
CREATE TABLE dbo.Table2   
    (ColA int PRIMARY KEY NOT NULL, ColB decimal(10,3) NOT NULL);  
GO  
INSERT INTO dbo.Table1 VALUES(1, 10.0), (1, 20.0);  
INSERT INTO dbo.Table2 VALUES(1, 0.0);  
GO  
UPDATE dbo.Table2   
SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB  
FROM dbo.Table2   
    INNER JOIN dbo.Table1   
    ON (dbo.Table2.ColA = dbo.Table1.ColA);  
GO  
SELECT ColA, ColB   
FROM dbo.Table2;  

FROM 句と WHERE CURRENT OF 句を組み合わせた場合にも同じ問題が発生します。The same problem can occur when the FROM and WHERE CURRENT OF clauses are combined. 次の例では、Table2 のどちらの行も FROM ステートメントの UPDATE 句の条件を満たします。In the following example, both rows in Table2 meet the qualifications of the FROM clause in the UPDATE statement. Table2 のどちらの列を使用してテーブル Table1 の行を更新するかは未定義です。It is undefined which row from Table2 is to be used to update the row in Table1.

USE AdventureWorks2012;  
GO  
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL  
    DROP TABLE dbo.Table1;  
GO  
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT NULL  
    DROP TABLE dbo.Table2;  
GO  
CREATE TABLE dbo.Table1  
    (c1 int PRIMARY KEY NOT NULL, c2 int NOT NULL);  
GO  
CREATE TABLE dbo.Table2  
    (d1 int PRIMARY KEY NOT NULL, d2 int NOT NULL);  
GO  
INSERT INTO dbo.Table1 VALUES (1, 10);  
INSERT INTO dbo.Table2 VALUES (1, 20), (2, 30);  
GO  
DECLARE abc CURSOR LOCAL FOR  
    SELECT c1, c2   
    FROM dbo.Table1;  
OPEN abc;  
FETCH abc;  
UPDATE dbo.Table1   
SET c2 = c2 + d2   
FROM dbo.Table2   
WHERE CURRENT OF abc;  
GO  
SELECT c1, c2 FROM dbo.Table1;  
GO  

互換性サポートCompatibility Support

FROM 句を UPDATE または DELETE ステートメントの対象テーブルに適用する場合、この句での READUNCOMMITTED ヒントと NOLOCK ヒントの使用は、将来のバージョンの SQL ServerSQL Server でサポートされなくなる予定です。Support for use of the READUNCOMMITTED and NOLOCK hints in the FROM clause that apply to the target table of an UPDATE or DELETE statement will be removed in a future version of SQL ServerSQL Server. 新しい開発作業ではこのコンテキストでのヒントの使用を避け、現在このヒントを使用しているアプリケーションは変更を検討してください。Avoid using these hints in this context in new development work, and plan to modify applications that currently use them.

データ型Data Types

char 列と nchar 列は、すべて定義された長さになるまで右側に空白が埋め込まれます。All char and nchar columns are right-padded to the defined length.

ANSI_PADDING を OFF に設定した場合、スペースだけの文字列を除いて、varchar 列と nvarchar 列に挿入したデータからは後続のスペースがすべて削除されます。If ANSI_PADDING is set to OFF, all trailing spaces are removed from data inserted into varchar and nvarchar columns, except in strings that contain only spaces. スペースだけで構成される文字列は空の文字列に切り捨てられます。These strings are truncated to an empty string. ANSI_PADDING を ON に設定すると、後続にスペースが挿入されます。If ANSI_PADDING is set to ON, trailing spaces are inserted. Microsoft SQL Server ODBC ドライバーおよび OLE DB Provider for SQL Server は、接続するたびに自動的に SET ANSI_PADDING を ON にします。The Microsoft SQL Server ODBC driver and OLE DB Provider for SQL Server automatically set ANSI_PADDING ON for each connection. これは、ODBC データ ソースで構成するか、または接続属性やプロパティで設定することができます。This can be configured in ODBC data sources or by setting connection attributes or properties. 詳細については、「SET ANSI_PADDING (Transact-SQL)」を参照してください。For more information, see SET ANSI_PADDING (Transact-SQL).

text 型、ntext 型、image 型の列を更新するUpdating text, ntext, and image Columns

UPDATE で textntextimage 型の列を変更する場合、NULL で列を更新しない限り、列が初期化され、有効なテキスト ポインターが割り当てられます。また、少なくとも 1 つのデータ ページが割り当てられます。Modifying a text, ntext, or image column with UPDATE initializes the column, assigns a valid text pointer to it, and allocates at least one data page, unless the column is being updated with NULL.

textntextimage 型のデータの大きな部分を置換または変更するには、UPDATE ステートメントではなく WRITETEXT または UPDATETEXT ステートメントを使用してください。To replace or modify large blocks of text, ntext, or image data, use WRITETEXT or UPDATETEXT instead of the UPDATE statement.

クラスター化キーと 1 つ以上の textntext、または image 列の両方を更新しているときに、UPDATE ステートメントで複数の行を変更する場合は、これらの列に対する部分更新は、値の完全な置き換えとして実行されます。If the UPDATE statement could change more than one row while updating both the clustering key and one or more text, ntext, or image columns, the partial update to these columns is executed as a full replacement of the values.

重要

ntexttextimage データ型は、将来の MicrosoftMicrosoftSQL ServerSQL Server バージョンで削除される予定です。The ntext, text, and image data types will be removed in a future version of MicrosoftMicrosoftSQL ServerSQL Server. 新しい開発作業では、これらのデータ型の使用は避け、現在これらのデータ型を使用しているアプリケーションは修正するようにしてください。Avoid using these data types in new development work, and plan to modify applications that currently use them. 代わりに、 nvarchar(max)varchar(max)varbinary(max) を使用してください。Use nvarchar(max), varchar(max), and varbinary(max) instead.

大きな値のデータ型を更新するUpdating Large Value Data Types

. WRITE ( expression , @Offset , @Length ) 句を使用し、varchar(max)nvarchar(max)varbinary(max) データ型の部分または完全更新を実行します。Use the . WRITE (expression,@Offset,@Length) clause to perform a partial or full update of varchar(max), nvarchar(max), and varbinary(max) data types. たとえば、varchar(max) 列の部分的な更新では、列の最初の 200 文字だけを削除または変更しますが、完全な更新では、列のすべてのデータを削除または変更します。For example, a partial update of a varchar(max) column might delete or modify only the first 200 characters of the column, whereas a full update would delete or modify all the data in the column. データベースの復旧モデルに一括ログ復旧モデルまたは単純復旧モデルが設定されている場合、 .WRITE で新しいデータを挿入または追加する際には、最小限しかログに記録されません。.WRITE updates that insert or append new data are minimally logged if the database recovery model is set to bulk-logged or simple. 既存の値を更新するときには、最小限のログ記録は使用されません。Minimal logging is not used when existing values are updated. 詳細については、「 トランザクション ログ (SQL Server)」を参照してください。For more information, see The Transaction Log (SQL Server).

データベース エンジンDatabase Engine では、UPDATE ステートメントで次のいずれかのアクションが発生するとき、部分更新が完全更新に変更されます。The データベース エンジンDatabase Engine converts a partial update to a full update when the UPDATE statement causes either of these actions:

  • パーティション ビューまたはパーティション テーブルのキー列が変更される場合。Changes a key column of the partitioned view or table.
  • 複数の行が変更され、定数以外の値に対する一意でないクラスター化インデックスのキーも更新される場合。Modifies more than one row and also updates the key of a nonunique clustered index to a nonconstant value.

.WRITE 句を使用して NULL 列を更新したり、column_name の値を NULL に設定したりすることはできません。You cannot use the .WRITE clause to update a NULL column or set the value of column_name to NULL.

@Offset と @Length は、varbinaryvarchar データ型の場合はバイト数で、nvarchar データ型の場合は文字数で指定します。@Offset and @Length are specified in bytes for varbinary and varchar data types and in characters for the nvarchar data type. 2 バイト文字セット (DBCS) の照合順序では、適切なオフセットが計算されます。The appropriate offsets are computed for double-byte character set (DBCS) collations.

最高のパフォーマンスが得られるよう、8,040 バイトの倍数の単位でデータを挿入または更新することをお勧めします。For best performance, we recommend that data be inserted or updated in chunk sizes that are multiples of 8040 bytes.

.WRITE 句で変更される列が OUTPUT 句で参照されている場合は、列の完全な値 (deleted. column_name の前イメージまたは inserted. column_name の後イメージのどちらか) が、テーブル変数内の指定された列に返されます。If the column modified by the .WRITE clause is referenced in an OUTPUT clause, the complete value of the column, either the before image in deleted.column_name or the after image in inserted.column_name, is returned to the specified column in the table variable. 後述する例 R を参照してください。See example R that follows.

他の文字型またはバイナリ データ型で .WRITE と同じ機能を実現するには、STUFF (Transact-SQL) を使用します。To achieve the same functionality of .WRITE with other character or binary data types, use the STUFF (Transact-SQL).

ユーザー定義型の列を更新するUpdating User-defined Type Columns

ユーザー定義型の列の値を更新するには、次のいずれかの方法を使用します。Updating values in user-defined type columns can be accomplished in one of the following ways:

  • ユーザー定義型で SQL ServerSQL Server システム データ型からの暗黙的または明示的な変換がサポートされている場合は、そのシステム データ型の値を指定します。Supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. 次の例は、文字列からの明示的な変換によって、ユーザー定義型 Point の列の値を更新する方法を示します。The following example shows how to update a value in a column of user-defined type Point, by explicitly converting from a string.

    UPDATE Cities  
    SET Location = CONVERT(Point, '12.3:46.2')  
    WHERE Name = 'Anchorage';  
    
  • ユーザー定義型のミューテーターとしてマークされたメソッドを呼び出して更新を行います。Invoking a method, marked as a mutator, of the user-defined type, to perform the update. 次の例では、Point 型の SetXY というミューテーター メソッドを呼び出します。The following example invokes a mutator method of type Point named SetXY. これにより、その型のインスタンスの状態が更新されます。This updates the state of the instance of the type.

    UPDATE Cities  
    SET Location.SetXY(23.5, 23.5)  
    WHERE Name = 'Anchorage';  
    

    注意

    SQL ServerSQL Server では、ミューテーター メソッドを Transact-SQLTransact-SQL NULL 値で呼び出した場合や、ミューテーター メソッドにより生成された新しい値が NULL である場合、エラーが返されます。returns an error if a mutator method is invoked on a Transact-SQLTransact-SQL null value, or if a new value produced by a mutator method is null.

  • ユーザー定義型の登録済みプロパティまたはパブリック データ メンバーの値を変更します。Modifying the value of a registered property or public data member of the user-defined type. 値を指定する式は、プロパティの型に暗黙的に変換できる必要があります。The expression supplying the value must be implicitly convertible to the type of the property. 次の例では、ユーザー定義型 X のプロパティ Point の値を変更します。The following example modifies the value of property X of user-defined type Point.

    UPDATE Cities  
    SET Location.X = 23.5  
    WHERE Name = 'Anchorage';  
    

    同一のユーザー定義型の列のプロパティを複数変更するには、複数の UPDATE ステートメントを実行するか、その型のミューテーター メソッドを呼び出します。To modify different properties of the same user-defined type column, issue multiple UPDATE statements, or invoke a mutator method of the type.

FILESTREAM データを更新するUpdating FILESTREAM Data

UPDATE ステートメントを使用すると、FILESTREAM フィールドを NULL 値、空の値、または比較的少量のインライン データに更新できます。You can use the UPDATE statement to update a FILESTREAM field to a null value, empty value, or a relatively small amount of inline data. ただし、大量のデータをファイルにストリーミングする場合は、Win32 インターフェイスを使用する方が効率的です。However, a large amount of data is more efficiently streamed into a file by using Win32 interfaces. FILESTREAM フィールドを更新すると、その基となるファイル システムの BLOB データが変更されます。When you update a FILESTREAM field, you modify the underlying BLOB data in the file system. FILESTREAM フィールドを NULL に設定すると、フィールドに関連付けられている BLOB データが削除されます。When a FILESTREAM field is set to NULL, the BLOB data associated with the field is deleted. 次のように使用できません。WRITE() は、FILESTREAM データへの部分更新を実行します。You cannot use .WRITE(), to perform partial updates to FILESTREAM data. 詳細については、「FILESTREAM (SQL Server)」をご覧ください。For more information, see FILESTREAM (SQL Server).

エラー処理Error Handling

行の更新が制約やルールに違反する場合、列の NULL 値の設定に違反する場合、または新しい値が互換性のないデータ型の場合には、ステートメントは取り消され、エラーが返されます。レコードは更新されません。If an update to a row violates a constraint or rule, violates the NULL setting for the column, or the new value is an incompatible data type, the statement is canceled, an error is returned, and no records are updated.

式の評価時に UPDATE ステートメントが算術エラー (オーバーフロー、0 による除算、ドメイン エラー) を検出した場合、更新は行われません。When an UPDATE statement encounters an arithmetic error (overflow, divide by zero, or a domain error) during expression evaluation, the update is not performed. バッチの残りの部分は実行されず、エラー メッセージが返されます。The rest of the batch is not executed, and an error message is returned.

クラスター化インデックスに関係する列を更新した結果、クラスター化インデックスと行のサイズが 8,060 バイトを超える場合、更新は失敗し、エラー メッセージが返されます。If an update to a column or columns participating in a clustered index causes the size of the clustered index and the row to exceed 8,060 bytes, the update fails and an error message is returned.

相互運用性Interoperability

UPDATE ステートメントをユーザー定義関数の本文で使用できるのは、変更対象のテーブルがテーブル変数の場合だけです。UPDATE statements are allowed in the body of user-defined functions only if the table being modified is a table variable.

INSTEAD OF トリガーが、テーブルに対する UPDATE 操作で定義されている場合は、UPDATE ステートメントの代わりにそのトリガーが実行されます。When an INSTEAD OF trigger is defined on UPDATE actions against a table, the trigger is running instead of the UPDATE statement. 以前のバージョンの SQL ServerSQL Server では、UPDATE およびその他のデータ変更ステートメントでサポートされているのは AFTER トリガーのみです。Earlier versions of SQL ServerSQL Server only support AFTER triggers defined on UPDATE and other data modification statements. FROM 句は、INSTEAD OF トリガーが定義されているビューを直接または間接的に参照する UPDATE ステートメントでは指定できません。The FROM clause cannot be specified in an UPDATE statement that references, either directly or indirectly, a view with an INSTEAD OF trigger defined on it. INSTEAD OF トリガーの詳細については、「CREATE TRIGGER (Transact-SQL)」を参照してください。For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

制限事項と制約事項Limitations and Restrictions

FROM 句は、INSTEAD OF トリガーが定義されているビューを直接または間接的に参照する UPDATE ステートメントでは指定できません。The FROM clause cannot be specified in an UPDATE statement that references, either directly or indirectly, a view that has an INSTEAD OF trigger defined on it. INSTEAD OF トリガーの詳細については、「CREATE TRIGGER (Transact-SQL)」を参照してください。For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

共通テーブル式 (CTE) が UPDATE ステートメントの対象である場合、ステートメント内の CTE に対するすべての参照を一致させる必要があります。When a common table expression (CTE) is the target of an UPDATE statement, all references to the CTE in the statement must match. たとえば、FROM 句で CTE に別名を割り当てた場合、CTE に対するすべての参照で別名を使用する必要があります。For example, if the CTE is assigned an alias in the FROM clause, the alias must be used for all other references to the CTE. CTE はオブジェクト ID を持たないため、CTE の参照は明確にする必要があります。SQL ServerSQL Server では、オブジェクト ID を使用して、オブジェクトと別名の暗黙的なリレーションシップを識別します。Unambiguous CTE references are required because a CTE does not have an object ID, which SQL ServerSQL Server uses to recognize the implicit relationship between an object and its alias. このリレーションシップがない場合、クエリ プランで予期しない結合動作やクエリ結果が生成される可能性があります。Without this relationship, the query plan may produce unexpected join behavior and unintended query results. 次の例では、更新操作の対象オブジェクトとして CTE を指定するときの、適切な方法と不適切な方法を示します。The following examples demonstrate correct and incorrect methods of specifying a CTE when the CTE is the target object of the update operation.

USE tempdb;  
GO  
-- UPDATE statement with CTE references that are correctly matched.  
DECLARE @x TABLE (ID int, Value int);  
DECLARE @y TABLE (ID int, Value int);  
INSERT @x VALUES (1, 10), (2, 20);  
INSERT @y VALUES (1, 100),(2, 200);  
  
WITH cte AS (SELECT * FROM @x)  
UPDATE x -- cte is referenced by the alias.  
SET Value = y.Value  
FROM cte AS x  -- cte is assigned an alias.  
INNER JOIN @y AS y ON y.ID = x.ID;  
SELECT * FROM @x;  
GO  

以下に結果セットを示します。Here is the result set.

ID     Value  
------ -----  
1      100  
2      200  
(2 row(s) affected)  

CTE 参照が正しく一致していない UPDATE ステートメント。UPDATE statement with CTE references that are incorrectly matched.

USE tempdb;  
GO  
DECLARE @x TABLE (ID int, Value int);  
DECLARE @y TABLE (ID int, Value int);  
INSERT @x VALUES (1, 10), (2, 20);  
INSERT @y VALUES (1, 100),(2, 200);  
  
WITH cte AS (SELECT * FROM @x)  
UPDATE cte   -- cte is not referenced by the alias.  
SET Value = y.Value  
FROM cte AS x  -- cte is assigned an alias.  
INNER JOIN @y AS y ON y.ID = x.ID;   
SELECT * FROM @x;   
GO  

以下に結果セットを示します。Here is the result set.

ID     Value  
------ -----  
1      100  
2      100  
(2 row(s) affected)  

ロック動作Locking Behavior

UPDATE ステートメントでは、常に、そのステートメントで変更するテーブルについて排他 (X) ロックを獲得し、トランザクションが完了するまでそのロックを保持します。An UPDATE statement always acquires an exclusive (X) lock on the table it modifies, and holds that lock until the transaction completes. 排他ロックをかけたトランザクション以外はデータを変更できません。With an exclusive lock, no other transactions can modify data. 別のロック手法を指定することにより、UPDATE ステートメントの存続期間におけるこの既定の動作をオーバーライドするためのテーブル ヒントを指定できます。ただし、このヒントは、経験豊富な開発者およびデータベース管理者が最後の手段としてのみ使用することを推奨します。You can specify table hints to override this default behavior for the duration of the UPDATE statement by specifying another locking method, however, we recommend that hints be used only as a last resort by experienced developers and database administrators. 詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。For more information, see Table Hints (Transact-SQL).

ログ記録の動作Logging Behavior

UPDATE ステートメントはログに記録されますが、 . WRITE 句を使用して値の大きなデータ型の一部を更新する場合には、最低限の内容だけがログに記録されます。The UPDATE statement is logged; however, partial updates to large value data types using the . WRITE clause are minimally logged. 詳細については、前のセクション「データ型」の「大きな値のデータ型を更新する」を参照してください。For more information, see "Updating Large Value Data Types" in the earlier section "Data Types".

SecuritySecurity

アクセス許可Permissions

対象のテーブルに対する UPDATE 権限が必要です。UPDATE permissions are required on the target table. UPDATE ステートメントで WHERE 句を指定する場合や、SET 句の expression でテーブル内の列を使用する場合は、SELECT 権限も必要です。SELECT permissions are also required for the table being updated if the UPDATE statement contains a WHERE clause, or if expression in the SET clause uses a column in the table.

UPDATE 権限は、特に指定のない限り、固定サーバー ロール sysadmin、固定データベース ロール db_owner、固定データベース ロール db_datawriter のメンバーと、テーブル所有者に与えられます。UPDATE permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. sysadmindb_ownerdb_securityadmin ロールのメンバーと、テーブル所有者は、他のユーザーに権限を譲渡できます。Members of the sysadmin, db_owner, and db_securityadmin roles, and the table owner can transfer permissions to other users.

使用例Examples

カテゴリCategory 主な構文要素Featured syntax elements
基本構文Basic Syntax UPDATEUPDATE
更新される行を制限するLimiting the Rows that Are Updated WHERE • TOP • WITH 共通テーブル式 • WHERE CURRENT OFWHERE • TOP • WITH common table expression • WHERE CURRENT OF
列の値を設定するSetting Column Values 計算値 • 複合演算子 • 既定値 • サブクエリcomputed values • compound operators • default values • subqueries
標準的なテーブル以外の対象オブジェクトを指定するSpecifying Target Objects Other than Standard Tables ビュー • テーブル変数 • テーブルの別名views • table variables • table aliases
他のテーブルのデータに基づいてデータを更新するUpdating Data Based on Data From Other Tables FROMFROM
リモート テーブルの行を更新するUpdating Rows in a Remote Table リンク サーバー • OPENQUERY • OPENDATASOURCElinked server • OPENQUERY • OPENDATASOURCE
ラージ オブジェクト データ型を更新するUpdating Large Object Data Types .WRITE • OPENROWSET.WRITE • OPENROWSET
ユーザー定義型を更新するUpdating User-defined Types ユーザー定義型user-defined types
ヒントを使用してクエリ オプティマイザーの既定の動作をオーバーライドするOverriding the Default Behavior of the Query Optimizer by Using Hints テーブル ヒント • クエリ ヒントtable hints • query hints
UPDATE ステートメントの結果をキャプチャするCapturing the Results of the UPDATE Statement OUTPUT 句OUTPUT clause
その他のステートメントで UPDATE を使用するUsing UPDATE in Other Statements ストアド プロシージャ • TRY...CATCHStored Procedures • TRY...CATCH

基本構文Basic Syntax

このセクションの例では、最低限必要な構文を使用して UPDATE ステートメントの基本機能を示します。Examples in this section demonstrate the basic functionality of the UPDATE statement using the minimum required syntax.

A.A. 単純な UPDATE ステートメントを使用するUsing a simple UPDATE statement

次の例では、Person.Address テーブル内のすべての行を対象に単一の列を更新します。The following example updates a single column for all rows in the Person.Address table.

USE AdventureWorks2012;  
GO  
UPDATE Person.Address  
SET ModifiedDate = GETDATE();  

B.B. 複数の列を更新するUpdating multiple columns

次の例では、Bonus テーブルのすべての行の CommissionPct 列、SalesQuota 列、および SalesPerson 列の値を更新します。The following example updates the values in the Bonus, CommissionPct, and SalesQuota columns for all rows in the SalesPerson table.

USE AdventureWorks2012;  
GO  
UPDATE Sales.SalesPerson  
SET Bonus = 6000, CommissionPct = .10, SalesQuota = NULL;  
GO  

更新される行を制限するLimiting the Rows that Are Updated

このセクションの例では、UPDATE ステートメントによって影響を受ける行の数を制限する方法を示します。Examples in this section demonstrate ways that you can use to limit the number of rows affected by the UPDATE statement.

C.C. WHERE 句を使用するUsing the WHERE clause

次の例では、WHERE 句を使用して更新する行を指定します。The following example uses the WHERE clause to specify which rows to update. このステートメントは、Production.Product テーブルの Color 列の値を更新します。Color 列の既存の値が 'Red' で、なおかつ Name 列の値が 'Road-250' で始まるすべての行が対象となります。The statement updates the value in the Color column of the Production.Product table for all rows that have an existing value of 'Red' in the Color column and have a value in the Name column that starts with 'Road-250'.

USE AdventureWorks2012;  
GO  
UPDATE Production.Product  
SET Color = N'Metallic Red'  
WHERE Name LIKE N'Road-250%' AND Color = N'Red';  
GO  

D.D. TOP 句を使用するUsing the TOP clause

次の例では、UPDATE ステートメントで変更される行の数を TOP 句で制限します。The following examples use the TOP clause to limit the number of rows that are modified in an UPDATE statement. UPDATE ステートメントで TOP (n) 句を使用した場合、ランダムに選択される 'n' 行に対して更新操作が実行されます。When a TOP (n) clause is used with UPDATE, the update operation is performed on a random selection of 'n' number of rows. 次の例では、VacationHours テーブル内のランダムな 10 個の行について、Employee 列を 25% 増しに更新します。The following example updates the VacationHours column by 25 percent for 10 random rows in the Employee table.

USE AdventureWorks2012;
GO
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25 ;
GO  

TOP を使用して、意味のある日時順に更新を適用する必要がある場合は、サブセレクト ステートメントに ORDER BY を含めて TOP を使用する必要があります。If you must use TOP to apply updates in a meaningful chronology, you must use TOP together with ORDER BY in a subselect statement. 次の例では、採用日の古い従業員上位 10 人の休暇時間を更新します。The following example updates the vacation hours of the 10 employees with the earliest hire dates.

UPDATE HumanResources.Employee  
SET VacationHours = VacationHours + 8  
FROM (SELECT TOP 10 BusinessEntityID FROM HumanResources.Employee  
     ORDER BY HireDate ASC) AS th  
WHERE HumanResources.Employee.BusinessEntityID = th.BusinessEntityID;  
GO  

E.E. WITH common_table_expression 句を使用するUsing the WITH common_table_expression clause

次の例では、PerAssemblyQty の製造に直接または間接的に使用されるすべての部品およびコンポーネントの ProductAssemblyID 800 の値を更新します。The following example updates the PerAssemblyQty value for all parts and components that are used directly or indirectly to create the ProductAssemblyID 800. 共通テーブル式は、ProductAssemblyID 800 の製造に直接使用される部品やそのコンポーネントの製造に使用される部品などを含む、部品の階層リストを返します。The common table expression returns a hierarchical list of parts that are used directly to build ProductAssemblyID 800 and parts that are used to build those components, and so on. 共通テーブル式が返した行のみが変更されます。Only the rows returned by the common table expression are modified.

USE AdventureWorks2012;  
GO  
WITH Parts(AssemblyID, ComponentID, PerAssemblyQty, EndDate, ComponentLevel) AS  
(  
    SELECT b.ProductAssemblyID, b.ComponentID, b.PerAssemblyQty,  
        b.EndDate, 0 AS ComponentLevel  
    FROM Production.BillOfMaterials AS b  
    WHERE b.ProductAssemblyID = 800  
          AND b.EndDate IS NULL  
    UNION ALL  
    SELECT bom.ProductAssemblyID, bom.ComponentID, p.PerAssemblyQty,  
        bom.EndDate, ComponentLevel + 1  
    FROM Production.BillOfMaterials AS bom   
        INNER JOIN Parts AS p  
        ON bom.ProductAssemblyID = p.ComponentID  
        AND bom.EndDate IS NULL  
)  
UPDATE Production.BillOfMaterials  
SET PerAssemblyQty = c.PerAssemblyQty * 2  
FROM Production.BillOfMaterials AS c  
JOIN Parts AS d ON c.ProductAssemblyID = d.AssemblyID  
WHERE d.ComponentLevel = 0;  

F.F. WHERE CURRENT OF 句を使用するUsing the WHERE CURRENT OF clause

次の例では、WHERE CURRENT OF 句を使用して、カーソルが置かれている行だけを更新します。The following example uses the WHERE CURRENT OF clause to update only the row on which the cursor is positioned. カーソルが結合に基づくとき、UPDATE ステートメントで指定した table_name のみが変更されます。When a cursor is based on a join, only the table_name specified in the UPDATE statement is modified. この場合、カーソルに関連する他のテーブルには影響ありません。Other tables participating in the cursor are not affected.

USE AdventureWorks2012;  
GO  
DECLARE complex_cursor CURSOR FOR  
    SELECT a.BusinessEntityID  
    FROM HumanResources.EmployeePayHistory AS a  
    WHERE RateChangeDate <>   
         (SELECT MAX(RateChangeDate)  
          FROM HumanResources.EmployeePayHistory AS b  
          WHERE a.BusinessEntityID = b.BusinessEntityID) ;  
OPEN complex_cursor;  
FETCH FROM complex_cursor;  
UPDATE HumanResources.EmployeePayHistory  
SET PayFrequency = 2   
WHERE CURRENT OF complex_cursor;  
CLOSE complex_cursor;  
DEALLOCATE complex_cursor;  
GO  

列の値を設定するSetting Column Values

このセクションの例では、計算値、サブクエリ、および DEFAULT 値を使用した列の更新を示します。Examples in this section demonstrate updating columns by using computed values, subqueries, and DEFAULT values.

G.G. 計算値を指定するSpecifying a computed value

次の例では、UPDATE ステートメントに計算値を使用しています。The following examples uses computed values in an UPDATE statement. ListPrice テーブルのすべての行の Product 列の値を倍にします。The example doubles the value in the ListPrice column for all rows in the Product table.

USE AdventureWorks2012 ;  
GO  
UPDATE Production.Product  
SET ListPrice = ListPrice * 2;  
GO  

H.H. 複合演算子を指定するSpecifying a compound operator

次の例では、変数 @NewPrice を使用し、赤い自転車の現在の価格を取得して 10 を追加することで、すべての赤い自転車の価格を増加させます。The following example uses the variable @NewPrice to increment the price of all red bicycles by taking the current price and adding 10 to it.

USE AdventureWorks2012;  
GO  
DECLARE @NewPrice int = 10;  
UPDATE Production.Product  
SET ListPrice += @NewPrice  
WHERE Color = N'Red';  
GO  

次の例では、複合演算子 += を使用して、' - tool malfunction' が 10 ~ 12 である行を対象に、Name 列の既存の値にデータ ScrapReasonID を追加します。The following example uses the compound operator += to append the data ' - tool malfunction' to the existing value in the column Name for rows that have a ScrapReasonID between 10 and 12.

USE AdventureWorks2012;  
GO  
UPDATE Production.ScrapReason   
SET Name += ' - tool malfunction'  
WHERE ScrapReasonID BETWEEN 10 and 12;  

I.I. SET 句でサブクエリを指定するSpecifying a subquery in the SET clause

次の例では、SET 句にサブクエリを使用して、列の更新に使用する値を決定します。The following example uses a subquery in the SET clause to determine the value that is used to update the column. サブクエリからは、スカラー値 (つまり、1 行につき単一の値) のみが返されます。The subquery must return only a scalar value (that is, a single value per row). この例では、SalesYTD テーブルの最新の売上高を反映するように SalesPerson テーブルの SalesOrderHeader 列を変更します。The example modifies the SalesYTD column in the SalesPerson table to reflect the most recent sales recorded in the SalesOrderHeader table. サブクエリにより、UPDATE ステートメントで各販売員の売上高が集計されます。The subquery aggregates the sales for each salesperson in the UPDATE statement.

USE AdventureWorks2012;  
GO  
UPDATE Sales.SalesPerson  
SET SalesYTD = SalesYTD +   
    (SELECT SUM(so.SubTotal)   
     FROM Sales.SalesOrderHeader AS so  
     WHERE so.OrderDate = (SELECT MAX(OrderDate)  
                           FROM Sales.SalesOrderHeader AS so2  
                           WHERE so2.SalesPersonID = so.SalesPersonID)  
     AND Sales.SalesPerson.BusinessEntityID = so.SalesPersonID  
     GROUP BY so.SalesPersonID);  
GO  

J.J. DEFAULT 値を使用して行を更新するUpdating rows using DEFAULT values

次の例では、CostRate の値が CostRate より大きいすべての行を対象に、20.00 列をその既定値 (0.00) に設定します。The following example sets the CostRate column to its default value (0.00) for all rows that have a CostRate value greater than 20.00.

USE AdventureWorks2012;  
GO  
UPDATE Production.Location  
SET CostRate = DEFAULT  
WHERE CostRate > 20.00;  

標準的なテーブル以外の対象オブジェクトを指定するSpecifying Target Objects Other Than Standard Tables

このセクションの例では、ビュー、テーブルの別名、またはテーブル変数を指定して行を更新する方法を示します。Examples in this section demonstrate how to update rows by specifying a view, table alias, or table variable.

K.K. ビューを対象オブジェクトとして指定するSpecifying a view as the target object

次の例では、対象オブジェクトとしてビューを指定し、テーブルの行を更新します。The following example updates rows in a table by specifying a view as the target object. ビュー定義では複数のテーブルが参照されますが、UPDATE ステートメントで参照されるのは、基になるいずれかのテーブルの列だけであるため、ステートメントは正常に実行されます。The view definition references multiple tables, however, the UPDATE statement succeeds because it references columns from only one of the underlying tables. 仮に両方のテーブルの列が指定された場合、UPDATE ステートメントは失敗します。The UPDATE statement would fail if columns from both tables were specified. 詳細については、「ビューを使用したデータ変更」を参照してください。For more information, see Modify Data Through a View.

USE AdventureWorks2012;  
GO  
UPDATE Person.vStateProvinceCountryRegion  
SET CountryRegionName = 'United States of America'  
WHERE CountryRegionName = 'United States';  

L.L. テーブルの別名を対象オブジェクトとして指定するSpecifying a table alias as the target object

次の例では、テーブル Production.ScrapReason の行を更新します。The follow example updates rows in the table Production.ScrapReason. FROM 句で ScrapReason に割り当てられたテーブルの別名は、UPDATE 句の対象オブジェクトとして指定されます。The table alias assigned to ScrapReason in the FROM clause is specified as the target object in the UPDATE clause.

USE AdventureWorks2012;  
GO  
UPDATE sr  
SET sr.Name += ' - tool malfunction'  
FROM Production.ScrapReason AS sr  
JOIN Production.WorkOrder AS wo   
     ON sr.ScrapReasonID = wo.ScrapReasonID  
     AND wo.ScrappedQty > 300;  

M.M. テーブル変数を対象オブジェクトとして指定するSpecifying a table variable as the target object

次の例では、テーブル変数内の行を更新します。The following example updates rows in a table variable.

USE AdventureWorks2012;  
GO  
-- Create the table variable.  
DECLARE @MyTableVar table(  
    EmpID int NOT NULL,  
    NewVacationHours int,  
    ModifiedDate datetime);  
  
-- Populate the table variable with employee ID values from HumanResources.Employee.  
INSERT INTO @MyTableVar (EmpID)  
    SELECT BusinessEntityID FROM HumanResources.Employee;  
  
-- Update columns in the table variable.  
UPDATE @MyTableVar  
SET NewVacationHours = e.VacationHours + 20,  
    ModifiedDate = GETDATE()  
FROM HumanResources.Employee AS e   
WHERE e.BusinessEntityID = EmpID;  
  
-- Display the results of the UPDATE statement.  
SELECT EmpID, NewVacationHours, ModifiedDate FROM @MyTableVar  
ORDER BY EmpID;  
GO  

他のテーブルのデータに基づいてデータを更新するUpdating Data Based on Data From Other Tables

このセクションの例では、テーブルの行を別のテーブルの情報に基づいて更新する方法を示します。Examples in this section demonstrate methods of updating rows from one table based on information in another table.

N.N. 別のテーブルの情報を使用して UPDATE ステートメントを実行するUsing the UPDATE statement with information from another table

次の例では、SalesOrderHeader テーブルの最新の売上高を反映するように SalesPerson テーブルの SalesYTD 列を変更します。The following example modifies the SalesYTD column in the SalesPerson table to reflect the most recent sales recorded in the SalesOrderHeader table.

USE AdventureWorks2012;  
GO  
UPDATE Sales.SalesPerson  
SET SalesYTD = SalesYTD + SubTotal  
FROM Sales.SalesPerson AS sp  
JOIN Sales.SalesOrderHeader AS so  
    ON sp.BusinessEntityID = so.SalesPersonID  
    AND so.OrderDate = (SELECT MAX(OrderDate)  
                        FROM Sales.SalesOrderHeader  
                        WHERE SalesPersonID = sp.BusinessEntityID);  
GO  

前の例では、特定の日付の指定された営業部員の売上は 1 つのみ記録され、更新が最新であるということを前提にしています。The previous example assumes that only one sale is recorded for a specified salesperson on a specific date and that updates are current. 指定された営業部員に対し、同じ日に 2 つ以上の売上が記録される場合は、前の例は正しく動作しません。If more than one sale for a specified salesperson can be recorded on the same day, the example shown does not work correctly. この場合、エラーなしで実行されますが、実際に同じ日に登録された売上件数に関係なく、1 つの売上のみを使用して SalesYTDの値が更新されます。The example runs without error, but each SalesYTD value is updated with only one sale, regardless of how many sales actually occurred on that day. これは、1 つの UPDATE ステートメントで同じ行を 2 回更新しないためです。This is because a single UPDATE statement never updates the same row two times.

同じ日に、指定した販売員の売り上げが複数記録されるような場合は、次の例のように、UPDATE ステートメントの中で販売員ごとにすべての売り上げを集計する必要があります。In the situation in which more than one sale for a specified salesperson can occur on the same day, all the sales for each sales person must be aggregated together within the UPDATE statement, as shown in the following example:

USE AdventureWorks2012;  
GO  
UPDATE Sales.SalesPerson  
SET SalesYTD = SalesYTD +   
    (SELECT SUM(so.SubTotal)   
     FROM Sales.SalesOrderHeader AS so  
     WHERE so.OrderDate = (SELECT MAX(OrderDate)  
                           FROM Sales.SalesOrderHeader AS so2  
                           WHERE so2.SalesPersonID = so.SalesPersonID)  
     AND Sales.SalesPerson.BusinessEntityID = so.SalesPersonID  
     GROUP BY so.SalesPersonID);  
GO  

リモート テーブルの行を更新するUpdating Rows in a Remote Table

このセクションの例では、リンク サーバーまたは行セット関数を使用してリモート テーブルを参照し、リモートの対象テーブルの行を更新する方法を示します。Examples in this section demonstrate how to update rows in a remote target table by using a linked server or a rowset function to reference the remote table.

O.O. リンク サーバーを使用してリモート テーブルのデータを更新するUpdating data in a remote table by using a linked server

次の例では、リモート サーバー上のテーブルを更新します。The following example updates a table on a remote server. sp_addlinkedserver を使用してリモート データ ソースへのリンクを作成した後、The example begins by creating a link to the remote data source by using sp_addlinkedserver. server.catalog.schema.object という形式の 4 部構成のオブジェクト名の一部として、リンク サーバー名 MyLinkedServer を指定します。The linked server name, MyLinkedServer, is then specified as part of the four-part object name in the form server.catalog.schema.object. @datasrc には有効なサーバー名を指定する必要があります。Note that you must specify a valid server name for @datasrc.

USE master;  
GO  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' or 'server_nameinstance_name'.  
  
EXEC sp_addlinkedserver @server = N'MyLinkedServer',  
    @srvproduct = N' ',  
    @provider = N'SQLNCLI10',   
    @datasrc = N'<server name>',  
    @catalog = N'AdventureWorks2012';  
GO  
USE AdventureWorks2012;  
GO  
-- Specify the remote data source using a four-part name   
-- in the form linked_server.catalog.schema.object.  
  
UPDATE MyLinkedServer.AdventureWorks2012.HumanResources.Department  
SET GroupName = N'Public Relations'  
WHERE DepartmentID = 4;  

P.P. OPENQUERY 関数を使用してリモート テーブルのデータを更新するUpdating data in a remote table by using the OPENQUERY function

次の例では、OPENQUERY 行セット関数を指定してリモート テーブルの行を更新します。The following example updates a row in a remote table by specifying the OPENQUERY rowset function. この例では、前の例で作成したリンク サーバー名を使用します。The linked server name created in the previous example is used in this example.

UPDATE OPENQUERY (MyLinkedServer, 'SELECT GroupName FROM HumanResources.Department WHERE DepartmentID = 4')   
SET GroupName = 'Sales and Marketing';  

Q.Q. OPENDATASOURCE 関数を使用してリモート テーブルのデータを更新するUpdating data in a remote table by using the OPENDATASOURCE function

次の例では、OPENDATASOURCE 行セット関数を指定してリモート テーブルの行を更新します。The following example updates a row in a remote table by specifying the OPENDATASOURCE rowset function. server_name または server_name\instance_name という形式を使用して、データ ソースの有効なサーバー名を指定します。Specify a valid server name for the data source by using the format server_name or server_name\instance_name. 場合によっては、SQL ServerSQL Server のインスタンスを Ad Hoc Distributed Queries 用に構成する必要があります。You may need to configure the instance of SQL ServerSQL Server for Ad Hoc Distributed Queries. 詳細については、「ad hoc distributed queries サーバー構成オプション」を参照してください。For more information, see ad hoc distributed queries Server Configuration Option.

UPDATE OPENDATASOURCE('SQLNCLI', 'Data Source=<server name>;Integrated Security=SSPI').AdventureWorks2012.HumanResources.Department
SET GroupName = 'Sales and Marketing' WHERE DepartmentID = 4;  

ラージ オブジェクト データ型を更新するUpdating Large Object Data Types

このセクションの例では、ラージ オブジェクト (LOB) データ型で定義された列の値を更新する方法を示します。Examples in this section demonstrate methods of updating values in columns that are defined with large object (LOB) data types.

R.R. UPDATE を .WRITE と共に使用し、nvarchar(max) 列のデータを変更するUsing UPDATE with .WRITE to modify data in an nvarchar(max) column

次の例では、.WRITE 句を使用して、Production.Document テーブルの DocumentSummary 型の nvarchar(max) 列の値を部分的に更新します。The following example uses the .WRITE clause to update a partial value in DocumentSummary, an nvarchar(max) column in the Production.Document table. 置換する語、既存データ内で置換される語の開始位置 (オフセット)、置換する文字数 (長さ) を指定することにより、components という語が、features という語で置換されます。The word components is replaced with the word features by specifying the replacement word, the starting location (offset) of the word to be replaced in the existing data, and the number of characters to be replaced (length). また、この例では、OUTPUT 句を使用して、DocumentSummary 列の前イメージと後イメージを @MyTableVar テーブル変数に返します。The example also uses the OUTPUT clause to return the before and after images of the DocumentSummary column to the @MyTableVar table variable.

USE AdventureWorks2012;  
GO  
DECLARE @MyTableVar table (  
    SummaryBefore nvarchar(max),  
    SummaryAfter nvarchar(max));  
UPDATE Production.Document  
SET DocumentSummary .WRITE (N'features',28,10)  
OUTPUT deleted.DocumentSummary,   
       inserted.DocumentSummary   
    INTO @MyTableVar  
WHERE Title = N'Front Reflector Bracket Installation';  
SELECT SummaryBefore, SummaryAfter   
FROM @MyTableVar;  
GO  

S.S. UPDATE を .WRITE と共に使用し、nvarchar(max) 列のデータを追加および削除するUsing UPDATE with .WRITE to add and remove data in an nvarchar(max) column

次の例は、現在、値に NULL が設定されている nvarchar(max) 列のデータを追加し、削除します。The following examples add and remove data from an nvarchar(max) column that has a value currently set to NULL. .WRITE 句を使用して NULL 列を変更することはできないため、まず列に一時的なデータを設定します。Because the .WRITE clause cannot be used to modify a NULL column, the column is first populated with temporary data. 次に .WRITE 句を使用して、このデータを正しいデータで置換します。This data is then replaced with the correct data by using the .WRITE clause. その後の例では、列の値の最後にデータを追加し、列からデータを削除 (切り捨て) し、最後に列から部分的なデータを削除します。The additional examples append data to the end of the column value, remove (truncate) data from the column and, finally, remove partial data from the column. SELECT ステートメントは、各 UPDATE ステートメントで生成されたデータ変更を表示します。The SELECT statements display the data modification generated by each UPDATE statement.

USE AdventureWorks2012;  
GO  
-- Replacing NULL value with temporary data.  
UPDATE Production.Document  
SET DocumentSummary = N'Replacing NULL value'  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
-- Replacing temporary data with the correct data. Setting @Length to NULL   
-- truncates all existing data from the @Offset position.  
UPDATE Production.Document  
SET DocumentSummary .WRITE(N'Carefully inspect and maintain the tires and crank arms.',0,NULL)  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
-- Appending additional data to the end of the column by setting   
-- @Offset to NULL.  
UPDATE Production.Document  
SET DocumentSummary .WRITE (N' Appending data to the end of the column.', NULL, 0)  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
-- Removing all data from @Offset to the end of the existing value by   
-- setting expression to NULL.   
UPDATE Production.Document  
SET DocumentSummary .WRITE (NULL, 56, 0)  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
-- Removing partial data beginning at position 9 and ending at   
-- position 21.  
UPDATE Production.Document  
SET DocumentSummary .WRITE ('',9, 12)  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  

T.T. UPDATE を OPENROWSET と共に使用し、varbinary(max) 列を変更するUsing UPDATE with OPENROWSET to modify a varbinary(max) column

次の例では、varbinary(max) 列に格納されている既存のイメージを新しいイメージで置換します。The following example replaces an existing image stored in a varbinary(max) column with a new image. OPENROWSET 関数を BULK オプションと共に使用し、列にイメージを読み込みます。The OPENROWSET function is used with the BULK option to load the image into the column. この例では、Tires.jpg という名前のファイルが指定されたファイル パスに存在することを前提としています。This example assumes that a file named Tires.jpg exists in the specified file path.

USE AdventureWorks2012;  
GO  
UPDATE Production.ProductPhoto  
SET ThumbNailPhoto = (  
    SELECT *  
    FROM OPENROWSET(BULK 'c:Tires.jpg', SINGLE_BLOB) AS x )  
WHERE ProductPhotoID = 1;  
GO  

U.U. UPDATE を使用して FILESTREAM データを変更するUsing UPDATE to modify FILESTREAM data

次の例では、UPDATE ステートメントを使用して、ファイル システムのファイルのデータを変更します。The following example uses the UPDATE statement to modify the data in the file system file. 大量のデータをファイルにストリーミングする場合、この方法はお勧めできません。We do not recommend this method for streaming large amounts of data to a file. 適切な Win32 インターフェイスを使用してください。Use the appropriate Win32 interfaces. ファイル レコード内の任意のテキストを、 Xray 1というテキストに置換する例を次に示します。The following example replaces any text in the file record with the text Xray 1. 詳細については、「FILESTREAM (SQL Server)」をご覧ください。For more information, see FILESTREAM (SQL Server).

UPDATE Archive.dbo.Records  
SET [Chart] = CAST('Xray 1' as varbinary(max))  
WHERE [SerialNumber] = 2;  

ユーザー定義型を更新するUpdating User-defined Types

次の例では、CLR ユーザー定義型 (UDT) の列の値を変更します。The following examples modify values in CLR user-defined type (UDT) columns. 3 つの方法が示されています。Three methods are demonstrated. ユーザー定義の列に関する詳細については、「CLR ユーザー定義型」を参照してください。For more information about user-defined columns, see CLR User-Defined Types.

V.V. システム データ型を使用するUsing a system data type

ユーザー定義型で SQL ServerSQL Server システム データ型からの暗黙的または明示的な変換がサポートされている場合は、そのシステム データ型の値を指定することによって、UDT を更新できます。You can update a UDT by supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. 次の例は、文字列からの明示的な変換によって、ユーザー定義型 Point の列の値を更新する方法を示します。The following example shows how to update a value in a column of user-defined type Point, by explicitly converting from a string.

UPDATE dbo.Cities  
SET Location = CONVERT(Point, '12.3:46.2')  
WHERE Name = 'Anchorage';  

W.W. メソッドを呼び出すInvoking a method

ミューテーターとしてマークされたユーザー定義型のメソッドを呼び出し、更新を実行することによって、UDT を更新できます。You can update a UDT by invoking a method, marked as a mutator, of the user-defined type, to perform the update. 次の例では、Point 型の SetXY というミューテーター メソッドを呼び出します。The following example invokes a mutator method of type Point named SetXY. これにより、その型のインスタンスの状態が更新されます。This updates the state of the instance of the type.

UPDATE dbo.Cities  
SET Location.SetXY(23.5, 23.5)  
WHERE Name = 'Anchorage';  

X.X. プロパティまたはデータ メンバーの値を変更するModifying the value of a property or data member

ユーザー定義型の登録済みプロパティまたはパブリック データ メンバーの値を変更することによって、UDT を更新できます。You can update a UDT by modifying the value of a registered property or public data member of the user-defined type. 値を指定する式は、プロパティの型に暗黙的に変換できる必要があります。The expression supplying the value must be implicitly convertible to the type of the property. 次の例では、ユーザー定義型 X のプロパティ Point の値を変更します。The following example modifies the value of property X of user-defined type Point.

UPDATE dbo.Cities  
SET Location.X = 23.5  
WHERE Name = 'Anchorage';  

ヒントを使用してクエリ オプティマイザーの既定の動作をオーバーライドするOverriding the Default Behavior of the Query Optimizer by Using Hints

このセクションの例では、テーブル ヒントとクエリ ヒントを使用して、UPDATE ステートメントを処理する際のクエリ オプティマイザーの既定の動作を一時的にオーバーライドする方法を示します。Examples in this section demonstrate how to use table and query hints to temporarily override the default behavior of the query optimizer when processing the UPDATE statement.

注意事項

通常、SQL ServerSQL Server クエリ オプティマイザーでは、クエリにとって最適な実行プランが選択されるため、ヒントは、経験を積んだ開発者やデータベース管理者が最後の手段としてのみ使用することをお勧めします。Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend that hints be used only as a last resort by experienced developers and database administrators.

Y.Y. テーブル ヒントを指定するSpecifying a table hint

次の例では、テーブル ヒント TABLOCK を指定します。The following example specifies the table hint TABLOCK. このヒントは、Production.Product テーブルに対して共有ロックを使用することと、このロックを UPDATE ステートメントの終了まで保持することを指定します。This hint specifies that a shared lock is taken on the table Production.Product and held until the end of the UPDATE statement.

USE AdventureWorks2012;  
GO  
UPDATE Production.Product  
WITH (TABLOCK)  
SET ListPrice = ListPrice * 1.10  
WHERE ProductNumber LIKE 'BK-%';  
GO  

Z.Z. クエリ ヒントを指定するSpecifying a query hint

次の例では、UPDATE ステートメントでクエリ ヒントOPTIMIZE FOR (@variable) を指定します。The following example specifies the query hintOPTIMIZE FOR (@variable) in the UPDATE statement. このヒントは、クエリをコンパイルおよび最適化するときにローカル変数に対して特定の値を使用するように、クエリ オプティマイザーに指示します。This hint instructs the query optimizer to use a particular value for a local variable when the query is compiled and optimized. この値はクエリを最適化する過程でのみ使用され、クエリの実行時には使用されません。The value is used only during query optimization, and not during query execution.

USE AdventureWorks2012;  
GO  
CREATE PROCEDURE Production.uspProductUpdate  
@Product nvarchar(25)  
AS  
SET NOCOUNT ON;  
UPDATE Production.Product  
SET ListPrice = ListPrice * 1.10  
WHERE ProductNumber LIKE @Product  
OPTION (OPTIMIZE FOR (@Product = 'BK-%') );  
GO  
-- Execute the stored procedure   
EXEC Production.uspProductUpdate 'BK-%';  

UPDATE ステートメントの結果をキャプチャするCapturing the Results of the UPDATE Statement

このセクションの例では、OUTPUT 句を使用して、UPDATE ステートメントの影響を受ける各行の情報や、それらに基づく式を返す方法を示します。Examples in this section demonstrate how to use the OUTPUT Clause to return information from, or expressions based on, each row affected by an UPDATE statement. これらの結果は処理アプリケーションに返され、確認メッセージの表示、アーカイブ化、その他のアプリケーション要件で使用することができます。These results can be returned to the processing application for use in such things as confirmation messages, archiving, and other such application requirements.

AA.AA. UPDATE ステートメントを OUTPUT 句と共に使用するUsing UPDATE with the OUTPUT clause

次の例では、最初の 10 行について VacationHours テーブルの列 Employee を 1.25 倍に更新し、列 ModifiedDate の値を現在の日付に設定します。The following example updates the column VacationHours in the Employee table by 25 percent for the first 10 rows and also sets the value in the column ModifiedDate to the current date. OUTPUT 句は、VacationHours を適用する前の UPDATE 列の deleted.VacationHours の値と、inserted.VacationHours 列の更新後の値を @MyTableVar テーブル変数に返します。The OUTPUT clause returns the value of VacationHours that exists before applying the UPDATE statement in the deleted.VacationHours column and the updated value in the inserted.VacationHours column to the @MyTableVar table variable.

この後に、SELECT 内の値、および @MyTableVar テーブルの更新操作の結果を返す 2 つの Employee ステートメントが続きます。Two SELECT statements follow that return the values in @MyTableVar and the results of the update operation in the Employee table. OUTPUT 句の使用例は、「OUTPUT 句 (Transact-SQL)」を参照してください。For more examples using the OUTPUT clause, see OUTPUT Clause (Transact-SQL).

USE AdventureWorks2012;  
GO  
DECLARE @MyTableVar table(  
    EmpID int NOT NULL,  
    OldVacationHours int,  
    NewVacationHours int,  
    ModifiedDate datetime);  
UPDATE TOP (10) HumanResources.Employee  
SET VacationHours = VacationHours * 1.25,  
    ModifiedDate = GETDATE()   
OUTPUT inserted.BusinessEntityID,  
       deleted.VacationHours,  
       inserted.VacationHours,  
       inserted.ModifiedDate  
INTO @MyTableVar;  
--Display the result set of the table variable.  
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate  
FROM @MyTableVar;  
GO  
--Display the result set of the table.  
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate  
FROM HumanResources.Employee;  
GO  

その他のステートメントで UPDATE を使用するUsing UPDATE in other statements

このセクションの例では、他のステートメントでの UPDATE の使用方法を示します。Examples in this section demonstrate how to use UPDATE in other statements.

AB.AB. UPDATE をストアド プロシージャで使用するUsing UPDATE in a stored procedure

次の例では、UPDATE ステートメントをストアド プロシージャで使用しています。The following example uses an UPDATE statement in a stored procedure. このプロシージャには、1 つの入力パラメーター @NewHours と 1 つの出力パラメーター @RowCount があります。The procedure takes one input parameter, @NewHours and one output parameter @RowCount. その @NewHours パラメーター値を UPDATE ステートメントで使用して、HumanResources.Employee テーブルの VacationHours 列を更新します。The @NewHours parameter value is used in the UPDATE statement to update the column VacationHours in the table HumanResources.Employee. 影響を受けた行数は、@RowCount 出力パラメーターを使用してローカル変数に返されます。The @RowCount output parameter is used to return the number of rows affected to a local variable. VacationHours に設定する値は、SET 句で CASE 式を使用して条件に応じて決定しています。The CASE expression is used in the SET clause to conditionally determine the value that is set for VacationHours. 従業員の給与が時給ベース (SalariedFlag = 0) である場合、VacationHours@NewHours で指定された値に現在の時間数を加算した値に設定されます。それ以外の場合は、VacationHours@NewHours で指定された値に設定されます。When the employee is paid hourly (SalariedFlag = 0), VacationHours is set to the current number of hours plus the value specified in @NewHours; otherwise, VacationHours is set to the value specified in @NewHours.

USE AdventureWorks2012;  
GO  
CREATE PROCEDURE HumanResources.Update_VacationHours  
@NewHours smallint  
AS   
SET NOCOUNT ON;  
UPDATE HumanResources.Employee  
SET VacationHours =   
    ( CASE  
         WHEN SalariedFlag = 0 THEN VacationHours + @NewHours  
         ELSE @NewHours  
       END  
    )  
WHERE CurrentFlag = 1;  
GO  
  
EXEC HumanResources.Update_VacationHours 40;  

AC.AC. TRY...CATCH ブロックで UPDATE を使用するUsing UPDATE in a TRY...CATCH Block

次の例では、TRY...CATCH ブロックで UPDATE ステートメントを使用して、更新操作中に発生した実行エラーを処理します。The following example uses an UPDATE statement in a TRY...CATCH block to handle execution errors that may occur during the update operation.

USE AdventureWorks2012;  
GO  
BEGIN TRANSACTION;  
  
BEGIN TRY  
    -- Intentionally generate a constraint violation error.  
    UPDATE HumanResources.Department  
    SET Name = N'MyNewName'  
    WHERE DepartmentID BETWEEN 1 AND 2;  
END TRY  
BEGIN CATCH  
    SELECT   
         ERROR_NUMBER() AS ErrorNumber  
        ,ERROR_SEVERITY() AS ErrorSeverity  
        ,ERROR_STATE() AS ErrorState  
        ,ERROR_PROCEDURE() AS ErrorProcedure  
        ,ERROR_LINE() AS ErrorLine  
        ,ERROR_MESSAGE() AS ErrorMessage;  
  
    IF @@TRANCOUNT > 0  
        ROLLBACK TRANSACTION;  
END CATCH;  
  
IF @@TRANCOUNT > 0  
    COMMIT TRANSACTION;  
GO  

例: SQL データ ウェアハウスSQL Data Warehouse および Parallel Data WarehouseParallel Data WarehouseExamples: SQL データ ウェアハウスSQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

AD.AD. 単純な UPDATE ステートメントを使用するUsing a simple UPDATE statement

次の例は、更新する行の指定に WHERE 句が使用されなかった場合に、すべての行がどのように影響を受けるかを示します。The following examples show how all rows can be affected when a WHERE clause is not used to specify the row (or rows) to update.

この例では、DimEmployee テーブルのすべての行の EndDate 列と CurrentFlag 列の値を更新します。This example updates the values in the EndDate and CurrentFlag columns for all rows in the DimEmployee table.

-- Uses AdventureWorks  
  
UPDATE DimEmployee  
SET EndDate = '2010-12-31', CurrentFlag='False';  

UPDATE ステートメントでは計算値を使用することもできます。You can also use computed values in an UPDATE statement. 次の例は、ListPrice テーブルのすべての行の Product 列の値を倍にします。The following example doubles the value in the ListPrice column for all rows in the Product table.

-- Uses AdventureWorks  
  
UPDATE DimEmployee  
SET BaseRate = BaseRate * 2;  

AE.AE. UPDATE ステートメントを WHERE 句と共に使用するUsing the UPDATE statement with a WHERE clause

次の例では、WHERE 句を使用して更新する行を指定します。The following example uses the WHERE clause to specify which rows to update.

-- Uses AdventureWorks  
  
UPDATE DimEmployee  
SET FirstName = 'Gail'  
WHERE EmployeeKey = 500;  

AF.AF. UPDATE ステートメントをラベルと共に使用するUsing the UPDATE statement with label

次の例では、UPDATE ステートメントのラベルの使用を示します。The following example shows use of a LABEL for the UPDATE statement.

-- Uses AdventureWorks  
  
UPDATE DimProduct  
SET ProductSubcategoryKey = 2   
WHERE ProductKey = 313  
OPTION (LABEL = N'label1');  

AG.AG. 別のテーブルの情報を使用して UPDATE ステートメントを実行するUsing the UPDATE statement with information from another table

この例では、年度別の売上合計を格納するテーブルを作成します。This example creates a table to store total sales by year. FactInternetSales テーブルに SELECT ステートメントを実行することで、2004 年度の売上合計を更新します。It updates the total sales for the year 2004 by running a SELECT statement against the FactInternetSales table.

-- Uses AdventureWorks  
  
CREATE TABLE YearlyTotalSales (  
    YearlySalesAmount money NOT NULL,  
    Year smallint NOT NULL )  
WITH ( DISTRIBUTION = REPLICATE );  
  
INSERT INTO YearlyTotalSales VALUES (0, 2004);  
INSERT INTO YearlyTotalSales VALUES (0, 2005);  
INSERT INTO YearlyTotalSales VALUES (0, 2006);  
  
UPDATE YearlyTotalSales  
SET YearlySalesAmount=  
(SELECT SUM(SalesAmount) FROM FactInternetSales WHERE OrderDateKey >=20040000 AND OrderDateKey < 20050000)  
WHERE Year=2004;  
  
SELECT * FROM YearlyTotalSales;   

AH.AH. 更新ステートメントの ANSI 結合置換ANSI join replacement for update statements

UPDATE または DELETE を実行するために ANSI 結合構文を使用して、3 つ以上のテーブルをまとめて結合する更新は複雑になることがあります。You may find you have a complex update that joins more than two tables together using ANSI joining syntax to perform the UPDATE or DELETE.

たとえば、次のテーブルを更新する必要があるとします。Imagine you had to update this table:

CREATE TABLE [dbo].[AnnualCategorySales]
(   [EnglishProductCategoryName]    NVARCHAR(50)    NOT NULL
,   [CalendarYear]                  SMALLINT        NOT NULL
,   [TotalSalesAmount]              MONEY           NOT NULL
)
WITH
(
    DISTRIBUTION = ROUND_ROBIN
)
;  

元のクエリは次のようになっている可能性があります。The original query might have looked something like this:

UPDATE  acs
SET     [TotalSalesAmount] = [fis].[TotalSalesAmount]
FROM    [dbo].[AnnualCategorySales]     AS acs
JOIN    (
        SELECT  [EnglishProductCategoryName]
        ,       [CalendarYear]
        ,       SUM([SalesAmount])              AS [TotalSalesAmount]
        FROM    [dbo].[FactInternetSales]       AS s
        JOIN    [dbo].[DimDate]                 AS d    ON s.[OrderDateKey]             = d.[DateKey]
        JOIN    [dbo].[DimProduct]              AS p    ON s.[ProductKey]               = p.[ProductKey]
        JOIN    [dbo].[DimProductSubCategory]   AS u    ON p.[ProductSubcategoryKey]    = u.[ProductSubcategoryKey]
        JOIN    [dbo].[DimProductCategory]      AS c    ON u.[ProductCategoryKey]       = c.[ProductCategoryKey]
        WHERE   [CalendarYear] = 2004
        GROUP BY
                [EnglishProductCategoryName]
        ,       [CalendarYear]
        ) AS fis
ON  [acs].[EnglishProductCategoryName]  = [fis].[EnglishProductCategoryName]
AND [acs].[CalendarYear]                = [fis].[CalendarYear]
;  

SQL データ ウェアハウスSQL Data Warehouse では UPDATE ステートメントの FROM 句での ANSI 結合がサポートされていないため、この SQL Server コードを少し変更しないと使用できません。Since SQL データ ウェアハウスSQL Data Warehouse does not support ANSI joins in the FROM clause of an UPDATE statement, you cannot copy this code over without changing it slightly.

CTAS と暗黙の結合を組み合わせて使用して、このコードを置き換えることができます。You can use a combination of a CTAS and an implicit join to replace this code:

-- Create an interim table
CREATE TABLE CTAS_acs
WITH (DISTRIBUTION = ROUND_ROBIN)
AS
SELECT  ISNULL(CAST([EnglishProductCategoryName] AS NVARCHAR(50)),0)    AS [EnglishProductCategoryName]
,       ISNULL(CAST([CalendarYear] AS SMALLINT),0)                      AS [CalendarYear]
,       ISNULL(CAST(SUM([SalesAmount]) AS MONEY),0)                     AS [TotalSalesAmount]
FROM    [dbo].[FactInternetSales]       AS s
JOIN    [dbo].[DimDate]                 AS d    ON s.[OrderDateKey]             = d.[DateKey]
JOIN    [dbo].[DimProduct]              AS p    ON s.[ProductKey]               = p.[ProductKey]
JOIN    [dbo].[DimProductSubCategory]   AS u    ON p.[ProductSubcategoryKey]    = u.[ProductSubcategoryKey]
JOIN    [dbo].[DimProductCategory]      AS c    ON u.[ProductCategoryKey]       = c.[ProductCategoryKey]
WHERE   [CalendarYear] = 2004
GROUP BY
        [EnglishProductCategoryName]
,       [CalendarYear]
;

-- Use an implicit join to perform the update
UPDATE  AnnualCategorySales
SET     AnnualCategorySales.TotalSalesAmount = CTAS_ACS.TotalSalesAmount
FROM    CTAS_acs
WHERE   CTAS_acs.[EnglishProductCategoryName] = AnnualCategorySales.[EnglishProductCategoryName]
AND     CTAS_acs.[CalendarYear]               = AnnualCategorySales.[CalendarYear]
;

--Drop the interim table
DROP TABLE CTAS_acs
;

参照See Also

CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
カーソル (Transact-SQL) Cursors (Transact-SQL)
DELETE (Transact-SQL) DELETE (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
テキスト関数とイメージ関数 (Transact-SQL) Text and Image Functions (Transact-SQL)
WITH common_table_expression (Transact-SQL) WITH common_table_expression (Transact-SQL)
FILESTREAM (SQL Server)FILESTREAM (SQL Server)