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

sp_executesql với câu lệnh 'IN'

Lý do nó không hoạt động là vì @ P1 được coi là một, một giá trị duy nhất.

ví dụ. khi @Code là X101, B202 thì truy vấn chỉ đang được chạy dưới dạng:SELECT * FROM Table WHERE RegionCode IN ('X101, B202') Vì vậy, nó đang tìm kiếm một RegionCode có giá trị được chứa bằng @ P1. Ngay cả khi bạn bao gồm các dấu nháy đơn, tất cả những gì có nghĩa là giá trị mà nó tìm kiếm trong Mã vùng được mong đợi sẽ chứa các dấu nháy đơn đó.

Bạn cần thực sự nối biến @Code vào văn bản lệnh sql @Cmd để biến nó hoạt động theo cách bạn đang nghĩ:

SET @Code = '''X101'',''B202'''
SET @Cmd = 'SELECT * FROM Table WHERE RegionCode IN (' + @Code + ')'
EXECUTE (@Cmd)

Rõ ràng là mặc dù vậy, điều này chỉ giúp bạn tiếp cận với SQL injection, vì vậy bạn cần phải hết sức cẩn thận nếu thực hiện phương pháp này để đảm bảo rằng bạn đề phòng điều đó.

Có những cách khác để giải quyết tình huống này mà bạn muốn chuyển vào danh sách động các giá trị để tìm kiếm.

Xem các ví dụ trên blog của tôi cho 2 cách tiếp cận bạn có thể sử dụng với SQL Server 2005. Một cách liên quan đến việc chuyển vào danh sách CSV ở dạng "Value1, Value2, Value3" mà sau đó bạn tách thành biến TABLE bằng cách sử dụng hàm do người dùng xác định (có rất nhiều đề cập về điều này cách tiếp cận nếu bạn thực hiện nhanh trên google hoặc tìm kiếm trang web này). Sau khi tách ra, bạn nối var TABLE đó vào truy vấn chính của mình. Cách tiếp cận thứ hai là chuyển vào một khối XML có chứa các giá trị và sử dụng chức năng XML tích hợp sẵn của SQL Server. Cả hai cách tiếp cận này đều được chứng minh với các số liệu hiệu suất trong liên kết đó và chúng không yêu cầu SQL động.

Nếu bạn đang sử dụng SQL Server 2008, Tham số giá trị bảng sẽ là cách tốt nhất - đó là cách tiếp cận thứ 3 mà tôi chứng minh trong liên kết đó là tốt nhất.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bảng nhỏ SQL được phân bổ trong bộ nhớ

  2. Thêm mối quan hệ Khoá ngoại giữa hai Cơ sở dữ liệu

  3. SQL 2008:Tắt Stop Words cho Truy vấn Tìm kiếm Toàn văn

  4. Len () so với datalength () trong SQL Server 2005

  5. Mã trạng thái lỗi trang web SSRS 500