2016-12-12 6 views
0

У меня есть SQL-запрос, хранящийся в таблице, содержащей имена параметров. Мне нужно знать, как правильно его выполнять в хранимой процедуре.Динамический 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 [email protected]) 
    BEGIN 
    DECLARE @SQLQUERY AS NVARCHAR(50) 
    SET @SQLQUERY=(SELECT SQLUPDATE FROM MASS_UPDATE WHERE [email protected]) 
    EXEC SP_EXECUTESQL @SQLQUERY 
    END 

и это SQL запрос из таблицы

update inventory_master_flex set [email protected] where [email protected] 

Я попытался заменить с реальными параметрами, но этой doen't работы ,

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

Когда вы выполнили этот «ВЫБРАТЬ ЗАМЕНИТЬ (ЗАМЕНИТЬ (@SQLQUERY,« @ VALUE », @ VALUE),« @ SKU », @ SKU), как выглядел запрос на обновление? Это выглядело правильно или нет? Что вы имеете в виду, это не работает? ** Если индексом и кодовым номером являются строки, вам нужны одинарные кавычки. ** –

+0

Капитализация отличается. По умолчанию SQL Server не учитывает регистр, но ваша таблица, база данных или сервер могут быть настроены по-разному. –

+0

Ваши значения не будут указаны с вашим текущим кодом 'REPLACE'. Вы должны правильно передать параметры, используя [sp_executesql] (https://technet.microsoft.com/en-us/library/ms175170.aspx) – Blorgbeard

ответ

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.

1

Передайте параметры при помощи sp_executesql, не replace():

IF EXISTS(SELECT CODENUMBER FROM INVENTORY_MASTER WHERE [email protected]) 
    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, так что отправляйтесь целиком и передавайте параметры.