2017-02-01 9 views
0
declare @String varchar(max), 
     @Stat varchar(3), 
     @Statval int 


SET @Stat = 'STR' 
SET @Statval = 500 

set @String = 'UPDATE [Addpoints] SET ['[email protected]+'] = ['[email protected]+'] + '[email protected]+'' 

SELECT @String 

Я пытаюсь построить запрос внутри @String из некоторых переменных. Но я получаю ошибку - «Конверсия не удалась при преобразовании значения varchar» UPDATE [Addpoints] SET 'в тип данных int.'Sql Server Building query from variables

В конце я хочу @String быть как этот

@String = 'Update [Addpoints] SET [STR] = [STR] + 500' 
+0

CAST (@statval AS VARCHAR) здесь + '+ @ statval +'» – Snowlockk

+0

спасибо за помощь! –

ответ

0

Вы должны бросить int значения varchar, которые прямо, когда вы объединить их в строку:

set @String = 'UPDATE [Addpoints] SET [' + @stat + '] = [' + @stat + '] + ' + 
       cast(@statval as varchar(max)) 
+0

И если ваш SQL Server достаточно новый, используйте ['concat'] (https://msdn.microsoft.com/en-us/library/hh231515.aspx). – GSerg

0

Два решения :

  • Сдайте свой statval в varchar как указано Andy
  • или, если у вас есть возможность, вы можете объявить statval непосредственно как VARCHAR
2

Ваш запрос не будет достаточно безопасным. Используйте вместо этого:

DECLARE @String NVARCHAR(MAX) 
    , @Stat VARCHAR(3) = 'STR' 
    , @Statval INT = 500; 

SET @String = N' 
    UPDATE A 
    SET A.' + QUOTENAME(@Stat) + N' += @Statval 
    -- SELECT * 
    FROM dbo.Addpoints AS A;'; 

PRINT @String; 

EXECUTE sys.sp_executesql @SQL, N'@Statval INT', @Statval; 

Этот запрос будет генерировать следующие:

UPDATE A 
SET A.[STR] += @Statval 
-- SELECT * 
FROM dbo.Addpoints AS A; 

Имейте в виду, что [STR] = [STR] + 500 точно так же, как и [STR] += @Statval, это просто хорошая стенография.

Как вы можете видеть, имена столбцов указаны. QUOTENAME() делает это для вас и ускользает от незаконных символов. И sp_executesql давайте создадим параметризованные запросы, которые являются безопасными, а их планы выполнения кэшируются.

В вашем случае @Statval будет присвоено значение 500.

+2

Это должно быть отмечено как ответ, поскольку оно адресовано не только требованию op, но и избегает инъекции sql –