Đơ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ơnexec
?
Đơ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ẻ sql-server
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ụ: