带参数的动态SQL

时间:2016-12-12 20:01:39

标签: sql sql-server dynamic

我有一个SQL查询存储在包含参数名称的表中。我需要知道如何在存储过程中正确执行它。

这是我在程序中的SQL代码

PROCEDURE [spMassUpdateSKUs]
@SKU AS NVARCHAR(20)
,@FIELD AS NVARCHAR(50)
,@VALUE AS NVARCHAR(50)
,@RESULT as Int = Null Output
AS
BEGIN
IF EXISTS(SELECT CODENUMBER FROM INVENTORY_MASTER WHERE CODENUMBER=@SKU)
    BEGIN   
    DECLARE @SQLQUERY AS NVARCHAR(50)
    SET @SQLQUERY=(SELECT SQLUPDATE FROM MASS_UPDATE WHERE DROPDOWNLABEL=@FIELD)
    EXEC SP_EXECUTESQL @SQLQUERY
    END

这是表中的SQL查询

update inventory_master_flex set departmentid=@value where codenumber=@sku

我尝试用真实的参数替换,但这不起作用。

SELECT REPLACE(REPLACE(@SQLQUERY,'@VALUE',@VALUE),'@SKU',@SKU)

2 个答案:

答案 0 :(得分:1)

使用sp_executesql而不是replace()

传递参数
IF EXISTS(SELECT CODENUMBER FROM INVENTORY_MASTER WHERE CODENUMBER=@SKU)
    BEGIN   
        DECLARE @SQLQUERY AS NVARCHAR(MAX);

        SET @SQLQUERY = (SELECT SQLUPDATE FROM MASS_UPDATE WHERE DROPDOWNLABEL = @FIELD);

        EXEC SP_EXECUTESQL @SQLQUERY, N'@SKU VARCHAR(255), @VALUE VARCHAR(255)', @SKU = @SKU, @VALUE = @VALUE
    END;

我不知道这些类型是什么。但如果其中一个或两个是字符串或日期,那么在实现中需要单引号。但是,您已经在使用sp_executesql,所以请进行全面的操作并传入参数。

答案 1 :(得分:1)

-- 50 is too short for sure; you may try 1000 or different number
DECLARE @SQLQUERY AS NVARCHAR(MAX)

-- for debug purpose
PRINT @SQLQUERY

-- params
EXEC SP_EXECUTESQL @SQLQUERY, N'@Value NVARCHAR(50), @sku NVARCHAR(50)`, @Value, @sku

对于带引号的字符串等,REPLACE不好用,这会扼杀@sqlquery代码。