5

いくつかの作業が必要な (レガシー) 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行を更新しますが、間違った列を更新します。私は間違って何をしていますか?

4

1 に答える 1

7

ストアド プロシージャを実行するときにパラメータ名を明示的に指定し、除外したいパラメータには null を渡す必要があります。例

exec spUpdateVendor2 @pID=102, @pVendorID = 1, @pVendorName = NULL, @pContact = 'Contact',
@pEmail = NULL ...
于 2012-10-24T22:40:51.293 に答える