Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Трябва да декларира скаларната променлива

Не можете да свържете int към низ. Вместо:

SET @sql = N'DECLARE @Rt int; SET @Rt = ' + @RowTo;

Нуждаете се от:

SET @sql = N'DECLARE @Rt int; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);

За да илюстрирам какво се случва тук. Да кажем @RowTo =5.

DECLARE @RowTo int;
SET @RowTo = 5;

DECLARE @sql nvarchar(max);
SET @sql = N'SELECT ' + CONVERT(varchar(12), @RowTo) + ' * 5';
EXEC sys.sp_executesql @sql;

За да го вградя в низ (дори в крайна сметка това да е число), трябва да го преобразувам. Но както можете да видите, числото все още се третира като число, когато се изпълни. Отговорът е 25, нали?

Във вашия случай можете да използвате правилна параметризация, вместо да използвате конкатенация, която, ако придобиете този навик, в даден момент ще се изложите на SQL инжекция (вижте това и това:

SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';

EXEC sys.sp_executesql @sql,
  N'@RowFrom int, @RowTo int',
  @RowFrom, @RowTo;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво представлява ограничението за проверка в SQL Server - SQL Server / TSQL урок, част 82

  2. Елементите ORDER BY трябва да се появят в списъка за избор, ако изразът съдържа оператор UNION, INTERSECT или EXCEPT (SQL Server)

  3. Какво представляват данни и информация и обеми данни

  4. Има ли начин да преминете през променлива на таблица в TSQL, без да използвате курсор?

  5. Проверете колко пощенски артикули са в опашката в базата данни Mail в SQL Server (T-SQL)