sql >> Database >  >> RDS >> Sqlserver

Moet de scalaire variabele declareren

Je kunt een int niet samenvoegen tot een string. In plaats van:

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

Je hebt nodig:

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

Om te helpen illustreren wat hier gebeurt. Laten we zeggen @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;

Om dat in een string te bouwen (zelfs als het uiteindelijk een getal zal zijn), moet ik het converteren. Maar zoals u kunt zien, wordt het nummer nog steeds als een nummer behandeld wanneer het wordt uitgevoerd. Het antwoord is 25, toch?

In jouw geval kun je de juiste parametrisering gebruiken in plaats van aaneenschakelingen. Als je die gewoonte aanneemt, zul je jezelf op een gegeven moment blootstellen aan SQL-injectie (zie dit en dit:

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

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


  1. Een bestandsgroep toevoegen aan een SQL Server-database (T-SQL)

  2. SUM() Functie in PostgreSQL

  3. SQL-sleutels, MUL versus PRI versus UNI

  4. Hoe MySQL/MariaDB-tabellen te optimaliseren