如何在不修改调用软件的情况下动态设置sp_executesql中参数的值

问题描述 投票:0回答:1

我当前正在使用一个使用

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 sql-server sql-server-2008 sql-server-2005
1个回答
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
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.