Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Phải khai báo các biến vô hướng

Bạn không thể nối một int với một chuỗi. Thay vì:

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

Bạn cần:

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

Để giúp minh họa những gì đang xảy ra ở đây. Giả sử @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;

Để xây dựng chuỗi đó thành một chuỗi (ngay cả khi cuối cùng nó sẽ là một số), tôi cần phải chuyển đổi nó. Nhưng như bạn có thể thấy, số vẫn được coi là một số khi nó được thực thi. Câu trả lời là 25, phải không?

Trong trường hợp của bạn, bạn có thể sử dụng tham số hóa thích hợp thay vì sử dụng nối, nếu bạn có thói quen đó, bạn sẽ để lộ bản thân với SQL injection vào một lúc nào đó (xem phần này và phần này:

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. nhận dạng từ chèn sql qua jdbctemplate

  2. Xóa các ký tự lạ (A có mũ) khỏi cột varchar của SQL Server

  3. Liệt kê tất cả các cột không thể xóa trong cơ sở dữ liệu máy chủ SQL

  4. Làm cách nào để có thể tạm thời vô hiệu hóa các ràng buộc khóa ngoại bằng T-SQL?

  5. SQL đệ quy CTE:Tìm các đối tượng được liên kết bởi thuộc tính