我有一个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)
答案 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代码。