SQL Serverで複数の変数を更新する2つの方法
T-SQLで複数の変数を1つのSELECTで更新する方法
しかし、複数の変数を更新する必要がある場合は、以下の2つの方法があります。
複数のUPDATE文を使用する
最も単純な方法は、それぞれの変数を更新するために個別のUPDATE文を使用することです。
-- 変数 @price を 10 に更新
UPDATE Products
SET Price = 10
WHERE ProductID = 1;
-- 変数 @stock を 50 に更新
UPDATE Products
SET Stock = 50
WHERE ProductID = 1;
動的SQLを使用する
より柔軟な方法としては、動的SQLを使用して、複数の変数を更新する単一のSQL文を生成する方法があります。
DECLARE @sql NVARCHAR(MAX);
-- 変数 @price と @stock の値に基づいて @sql に SQL 文を生成
SET @sql = '
UPDATE Products
SET Price = @price,
Stock = @stock
WHERE ProductID = 1';
-- 生成された SQL 文を実行
EXEC sp_executesql @sql, NVARCHAR(4000), @price, 10, @stock, 50;
この方法では、生成されたSQL文を事前に確認してから実行することができるので、より安全に複数の変数を更新することができます。
その他の注意事項
- 上記の例では、
ProductID = 1
という条件でレコードを更新していますが、この条件は必要に応じて変更することができます。 - 動的SQLを使用する場合は、SQLインジェクションの脆弱性に注意する必要があります。
-- 変数 @price を 10 に更新
UPDATE Products
SET Price = 10
WHERE ProductID = 1;
-- 変数 @stock を 50 に更新
UPDATE Products
SET Stock = 50
WHERE ProductID = 1;
このコードは、Products
テーブルの ProductID = 1
のレコードの Price
列を 10 に、Stock
列を 50 に更新します。
DECLARE @sql NVARCHAR(MAX);
-- 変数 @price と @stock の値に基づいて @sql に SQL 文を生成
SET @sql = '
UPDATE Products
SET Price = @price,
Stock = @stock
WHERE ProductID = 1';
-- 生成された SQL 文を実行
EXEC sp_executesql @sql, NVARCHAR(4000), @price, 10, @stock, 50;
説明
- 上記のコードでは、
Products
テーブルという架空のテーブルを使用しています。実際のテーブル名に変更してください。 ProductID = 1
という条件は、必要に応じて変更することができます。- 動的SQLを使用する場合は、
sp_executesql
プロシージャを使用する必要があります。このプロシージャは、SQL Server Management Studio などのツールを使用して実行することができます。
注意事項
- 上記のコードはあくまでサンプルであり、実際の運用環境では必要に応じて修正する必要があります。
T-SQLで複数の変数を更新するその他の方法
MERGE文を使用する
MERGE文は、INSERT、UPDATE、DELETE操作を1つの文で実行できる強力な文です。複数の変数を更新するために使用することもできます。
MERGE Products AS target
USING (
SELECT 10 AS Price, 50 AS Stock
) AS source
ON (target.ProductID = 1)
WHEN MATCHED THEN
UPDATE SET
target.Price = source.Price,
target.Stock = source.Stock;
CTE(共通表式)を使用する
CTEは、一時的な結果セットを定義するために使用できるサブクエリです。複数の変数を更新するために使用することもできます。
WITH updatedValues AS (
SELECT 10 AS Price, 50 AS Stock
)
UPDATE Products
SET Price = updatedValues.Price,
Stock = updatedValues.Stock
WHERE ProductID = 1;
プロシージャを使用する
プロシージャは、再利用可能なコードブロックです。複数の変数を更新するために使用することもできます。
CREATE PROCEDURE UpdateProduct @ProductID INT, @Price DECIMAL(10,2), @Stock INT
AS
BEGIN
UPDATE Products
SET Price = @Price,
Stock = @Stock
WHERE ProductID = @ProductID;
END;
EXEC UpdateProduct 1, 10, 50;
- シンプルな更新操作の場合は、複数のUPDATE文を使用する方が簡単です。
- より柔軟な更新操作が必要な場合は、動的SQL、MERGE文、CTE、またはプロシージャを使用することができます。
- パフォーマンスが重要な場合は、動的SQLを使用しない方がよい場合があります。
sql sql-server t-sql