Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Musisz zadeklarować zmienną skalę

Nie można połączyć int z łańcuchem. Zamiast:

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

Potrzebujesz:

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

Aby pomóc zilustrować, co się tutaj dzieje. Powiedzmy, że @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;

Aby zbudować z tego łańcuch (nawet jeśli ostatecznie będzie to liczba), muszę go przekonwertować. Ale jak widać, liczba jest nadal traktowana jako liczba podczas wykonywania. Odpowiedź to 25, prawda?

W twoim przypadku możesz użyć odpowiedniej parametryzacji zamiast używać konkatenacji, która, jeśli wpadniesz w ten nawyk, w pewnym momencie narazisz się na wstrzyknięcie SQL (zobacz to i to:

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. Jak działa funkcja CHARINDEX() w SQL Server (T-SQL)

  2. Przekroczenie limitu czasu zapytania po wykonaniu z sieci, ale superszybkie po wykonaniu z SSMS

  3. Nieprawidłowa nazwa kolumny błąd sql

  4. Znajdź kolumnę partycjonowania dla partycjonowanej tabeli w SQL Server (T-SQL)

  5. Jak działa funkcja SOUNDEX() serwera SQL?