2つのテーブルtbPOValidation
とtbPOValidationTemp
を使用するストアドプロシージャをSQL Serverに作成しました。SQLコードより下ではどのように最適化できますか?
tbPOValidationTemp
の行がtbPOValidation
にある場合は、tbPOValidationTemp
の値でtbPOValidation
を更新します。
が存在しない場合は、tbPOValidationTemp
の行をtbPOValidation
に挿入します。
このSQLはこのジョブを実行しますが、私がやっていることは安全ではないと思います。どのようにすれば、コードを最適化して、安全に機能させることができますか?
CREATE PROCEDURE spPOValidation
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS(SELECT *
FROM tbPOValidation
WHERE ShoppingCartNo IN (SELECT ShoppingCartNo
FROM tbPOValidationTemp)
AND LineItemNo IN (SELECT LineItemNo
FROM tbPOValidationTemp)
AND PONo IN (SELECT PONo FROM tbPOValidationTemp))
BEGIN
INSERT INTO tbPOValidation (SupplierName, DUNS, PONo, LineItemNo, PurchDocItemDesc, POIssueDate, DeliveryDate, PurchDocType, MtrNo,
Location, PayTerms, BlanketNo, BlanketLineItemNo, ShoppingCartNo, SHCItmNo, ItemPricing, ItmPrcCurrency, Per, POValue, POValueCurrency,
Qty, UOM, MFGName, MFGPartNO, Description, Remarks, Accept, AcceptedBy, AcceptedOn, RejectionReason)
SELECT
SupplierName, DUNS, PONo, LineItemNo, PurchDocItemDesc,
POIssueDate, DeliveryDate, PurchDocType, MtrNo,
Location, PayTerms, BlanketNo, BlanketLineItemNo,
ShoppingCartNo, SHCItmNo, ItemPricing, ItmPrcCurrency, Per,
POValue, POValueCurrency, Qty, UOM, MFGName, MFGPartNO,
Description, Remarks, Accept, AcceptedBy, AcceptedOn, RejectionReason
FROM
tbPOValidationTemp
END
ELSE
BEGIN
UPDATE t
SET t.SupplierName = v.SupplierName, t.DUNS = v.DUNS,
t.PONo = v.PONo, t.LineItemNo = v.LineItemNo,
t.PurchDocItemDesc = v.PurchDocItemDesc,
t.POIssueDate = v.POIssueDate, t.DeliveryDate = v.DeliveryDate,
t.PurchDocType = v.PurchDocType, t.MtrNo = v.MtrNo,
t.Location = v.Location, t.PayTerms = v.PayTerms,
t.BlanketNo = v.BlanketNo,
t.BlanketLineItemNo = v.BlanketLineItemNo,
t.ShoppingCartNo = v.ShoppingCartNo,
t.SHCItmNo = v.SHCItmNo, t.ItemPricing = v.ItemPricing,
t.ItmPrcCurrency = v.ItmPrcCurrency, t.Per = v.Per,
t.POValue = v.POValue, t.POValueCurrency = v.POValueCurrency,
t.Qty = v.Qty, t.UOM = v.UOM, t.MFGName = v.MFGName,
t.MFGPartNO = v.MFGPartNO, t.Description = v.Description,
t.Remarks = v.Remarks, t.Accept = v.Accept,
t.AcceptedBy = v.AcceptedBy, t.AcceptedOn = v.AcceptedOn,
t.RejectionReason = v.RejectionReason
FROM
tbPOValidation t
JOIN
tbpovalidationtemp v ON t.ShoppingCartNo = v.ShoppingCartNo
AND t.LineItemNo = v.LineItemNo
AND t.PONo = v.PONo
END
TRUNCATE TABLE tbPOValidationTemp
END
あなたの「存在しない場合は(...)」チェックでShoppingCartNo/LineItemNo/PONoの組み合わせを探しているのではなく、値が個別に存在しているようです。 LineItemNoが特定のショッピングカート(たとえば1〜X)の一意でないラインアイテム番号である場合、LineItemNo = 1に欠けている行を挿入しないでください。MERGEステートメント[link](https: //docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql) – Forty3
「Not Safe」とはどういう意味ですか? – Missy
SQL Server 2008のMERGE機能を使用することができます。以下のリンクを参照してください - https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx –