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

Làm cách nào để chuyển một biến có chứa danh sách vào một truy vấn SQL động?

Đơn giản

EXECUTE ('select id from  [dbo].[CSVToTable] ('''[email protected]+''')')
        declare @listOfIDs varchar(1000);

Hoặc, đó là cách tốt hơn

SET @listOfIDs = '5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61'; 

EXECUTE sp_executesql N'select id from  [dbo].[CSVToTable] (@listOfIDs)',
                      N'@listOfIDs VARCHAR(1000)',
                      @listOfIDs;
  • Tại sao tôi gặp lỗi này?

Bởi vì bạn thực sự chuyển quá nhiều tham số, sau đó cần thiết hơn, để hiểu điều này, hãy chạy truy vấn này và xem bạn thực sự được chuyển vào hàm của mình những gì

SELECT 'select id from  [dbo].[CSVToTable] ('[email protected]+')';

sẽ trả về (và đây là những gì bạn thực sự đang cố gắng thực thi)

select id from  [dbo].[CSVToTable] (5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61)

thay vì (đó là những gì bạn cần)

SELECT 'select id from  [dbo].[CSVToTable] ('''[email protected]+''')';
  • Ok, nhưng tại sao lại sp_executesql tốt hơn exec ?

Đơn giản, EXEC sẽ buộc bạn nối tất cả các biến của mình thành một chuỗi duy nhất, đó là điều tồi tệ nhất về nó và điều đó làm cho mã của bạn hoàn toàn mở cho SQL injection . Xem Bad Habits to Kick : Using EXEC() instead of sp_executesql , điều này không có nghĩa là sp_executesql là 100% an toàn, nhưng nó cho phép các câu lệnh được tham số hóa while EXEC() không, do đó, nó an toàn hơn EXEC xét về SQL injection .

Cuối cùng, vì bạn gắn thẻ và bạn không chỉ định phiên bản, tôi khuyên bạn nên sử dụng SPLIT_STRING() function (2016+) tốt hơn của bạn và nếu bạn không có phiên bản 2016+, hãy tạo của riêng bạn mà không sử dụng WHILE để đạt được hiệu suất tốt hơn, gây ra WHILE vòng lặp sẽ hoạt động chậm, do đó bạn nên tránh nó.

Ví dụ:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cơ sở dữ liệu hệ thống SQL Server - Khái niệm cơ bản

  2. Sự khác biệt giữa các kiểu chuỗi khác nhau trong SQL Server?

  3. Làm cách nào để chỉ chọn các hàng đầu tiên cho mỗi giá trị duy nhất của một cột?

  4. Tìm ngày / giờ cột của bảng được tạo

  5. Chèn hàng loạt danh sách chung C # vào SQL Server