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

SQL động và tối ưu hóa thủ tục được lưu trữ

Nếu bạn có nhiều khối IF lồng nhau thì SQL Server sẽ có thể lưu trữ các kế hoạch thực thi. Tôi giả sử rằng các IF là đơn giản, ví dụ:IF @ Tham số1 KHÔNG ĐẦY ĐỦ

Câu trả lời của SchmitzIT là đúng vì SQL Server cũng có thể lưu trữ các đường dẫn thực thi cho SQL động. Tuy nhiên, điều này chỉ đúng nếu sql được xây dựng và thực thi đúng cách.

Bằng cách xây dựng đúng cách, tôi có nghĩa là khai báo rõ ràng các tham số và chuyển chúng đến sp_executesql. Ví dụ

declare @Param1 nvarchar(255) = 'foo'
        ,@Param2 nvarchar(255) = 'bar'
        ,@sqlcommand nvarchar(max)
        ,@paramList nvarchar(max)

set @paramList = '@Param1 nvarchar(255), @Param2 nvarchar(255)'
set @sqlcommand = N'Select Something from Table where Field1 = @Param1 AND Field2 = @Param2'

exec sp_executesql @statement = @sqlcommand
                  ,@params = @paramList
                  ,@Param1 = @Param1
                  ,@Param2 = @Param2

Như bạn có thể thấy, văn bản lệnh sql không làm cứng các giá trị tham số để sử dụng. Chúng được chuyển một cách riêng biệt trong thi hành sp_executesql

Nếu bạn viết sqL động cũ không tốt

set @sqlcommand = N'Select Something from Table where Field1 = ' + @Param1  + ' AND Field2 = ' + @Param2

exec sp_executesql @sqlcommand

thì SQL Server sẽ không thể lưu trữ các kế hoạch thực thi



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thêm Người dùng Windows vào Máy chủ SQL cục bộ bằng PowerShell

  2. Sắp xếp các kết quả SQL Server theo mệnh đề IN

  3. đăng nhập không thành công cho người dùng 'sa'. Người dùng không được liên kết với kết nối SQL Server đáng tin cậy. (Microsoft SQL Server, Lỗi:18452) trong sql 2008

  4. T-Sql dường như đang đánh giá câu lệnh If ngay cả khi điều kiện không đúng

  5. Thay thế ISNUMERIC () hiệu quả trên SQL Server?