いくつかの作業が必要な (レガシー) VB6 プログラムがあります。ベンダーのテーブルを更新するストアド プロシージャがあります。この特定のフォームでは、行全体を更新する必要はなく、20 列のうち 10 列程度を更新するだけです。
行全体を更新したい場合に正常に動作する疑似コードを次に示します。
CREATE PROCEDURE [dbo].[spUpdateVendor](
@pID INT,
@pVendorID varchar(254),
@pVendorName varchar(255),
@pContact varchar(255),
@pEmail varchar(255),
...)
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON
DECLARE @ErrorMessage nvarchar(4000);
BEGIN TRY
-- Start the transaction
BEGIN TRANSACTION
UPDATE tblVendor
SET
[Vendor ID] = @pVendorID,
[Vendor Name] = @pVendorName,
[Contact] = @pContact,
[email] = @pEmail
...
WHERE
[ID] = @pID
COMMIT TRANSACTION;
END TRY
一部の列のみをデータで更新したい場合は、私が試した(疑似)コードです(オプションのパラメーターを使用しようとしています):
CREATE PROCEDURE [dbo].[spUpdateVendor2](
@pID INT,
@pVendorID varchar(254) = NULL,
@pVendorName varchar(255) = NULL,
@pContact varchar(255) = NULL,
@pEmail varchar(255) = NULL,
...)
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON
DECLARE @ErrorMessage nvarchar(4000);
BEGIN TRY
-- Start the transaction
BEGIN TRANSACTION
UPDATE tblVendor
SET
[Vendor ID] = ISNULL(@pVendorID,[Vendor ID]),
[Vendor Name] = ISNULL(@pVendorName,[Vendor Name]),
[Contact] = ISNULL(@pContact,[Contact]),
[Email] = ISNULL(@pEmail,[email]),
...
WHERE
[ID] = @pID
COMMIT TRANSACTION;
END TRY
すべてエラーなしで実行されますが、1 つのオプションの列を更新し、いくつかをスキップしてから、別のオプションの列を更新すると、間違った列が更新されます。
通常のパラメータを使用した更新の例:
tblVendor
ID: 2924
Vendor ID: Company1
Vendor Name: Company Name
Contact: Bob
email: bob@company.com
「連絡先」を指定しない場合にオプションのパラメーターを介して更新する例:
tblVendor
ID: 2924
Vendor ID: Company1
Vendor Name: Company Name
Contact: bob@company.com
email: bob@company.com
SO行を更新しますが、間違った列を更新します。私は間違って何をしていますか?