Aar*_*iec 5 t-sql sql-server stored-procedures optional-parameters
我有一个(遗留的)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
Run Code Online (Sandbox Code Playgroud)
如果我只想更新一些带有数据的列,那么就是我尝试过的(伪)代码(尝试使用可选参数):
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
Run Code Online (Sandbox Code Playgroud)
它全部运行没有错误但如果我更新一个可选列,跳过一些,然后更新另一个可选列,它将更新错误的列.
使用常规参数进行更新的示例:
tblVendor
ID: 2924
Vendor ID: Company1
Vendor Name: Company Name
Contact: Bob
email: bob@company.com
Run Code Online (Sandbox Code Playgroud)
当我不提供"联系"时,通过可选参数进行更新的示例:
tblVendor
ID: 2924
Vendor ID: Company1
Vendor Name: Company Name
Contact: bob@company.com
email: bob@company.com
Run Code Online (Sandbox Code Playgroud)
所以它更新了行,但它更新了错误的列.我做错了什么?
您必须在执行存储过程时显式指定参数名称,并为要省略的那些传入null.例
exec spUpdateVendor2 @pID=102, @pVendorID = 1, @pVendorName = NULL, @pContact = 'Contact',
@pEmail = NULL ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17187 次 |
| 最近记录: |