我当前正在使用一个使用
EXEC sp_executesql
执行 INSERT 语句的存储过程。该过程需要多个参数,包括 @TRANSACTIONNUM
、@CUSTOMERNUM
、@VALUE
和 @VALID
。 @VALID
的值当前已硬编码为 0
。但是,每当调用 SP 时,我都需要根据某些条件动态设置 @VALID
的值。
挑战在于这个存储过程正在由软件应用程序调用,而我们此时无法更新软件或关闭服务器来进行更改。
我听说过的一个可能的解决方案是
Wrapper function
,但是,我不确定这是否可行,或者是否有任何潜在的陷阱或限制需要考虑。
这是上述软件调用的当前存储过程(摘自
SQL profiler
):
EXEC sp_executesql
N'
INSERT INTO CUSTOMERINVEST
(
TRANSACTIONNUM,
CUSTOMERNUM,
VALUE,
VALID
)
VALUES
(
@TRANSACTIONNUM,
@CUSTOMERNUM,
@VALUE,
@VALID
)
',
N'
@TRANSACTIONNUM nvarchar(25),
@CUSTOMERNUM nvarchar(25),
@VALUE nvarchar(25),
@VALID int
',
@TRANSACTIONNUM = '4567654-879975',
@CUSTOMERNUM = '7654666765',
@VALUE = '86786765675',
@VALID = 0
在 sql-server-2008 中尝试创建包装存储过程:
CREATE PROCEDURE dbo.WrapperInsertCustomerInvest
@TRANSACTIONNUM nvarchar(25),
@CUSTOMERNUM nvarchar(25),
@VALUE nvarchar(25)
AS
BEGIN
DECLARE @VALID int;
-- Determine the value of @VALID based on your conditions
-- Example condition: set @VALID to 1 if @VALUE is greater than a certain amount
IF @VALUE > '1000000'
BEGIN
SET @VALID = 1;
END
ELSE
BEGIN
SET @VALID = 0;
END
-- Call the original stored procedure using sp_executesql
DECLARE @sql nvarchar(max);
SET @sql = N'
INSERT INTO CUSTOMERINVEST
(
TRANSACTIONNUM,
CUSTOMERNUM,
VALUE,
VALID
)
VALUES
(
@TRANSACTIONNUM,
@CUSTOMERNUM,
@VALUE,
@VALID
)';
EXEC sp_executesql
@sql,
N'@TRANSACTIONNUM nvarchar(25), @CUSTOMERNUM nvarchar(25), @VALUE nvarchar(25), @VALID int',
@TRANSACTIONNUM = @TRANSACTIONNUM,
@CUSTOMERNUM = @CUSTOMERNUM,
@VALUE = @VALUE,
@VALID = @VALID;
END