Một lời khuyên. Khi kiểm tra một tập lệnh động, trước tiên chỉ cần hiển thị nó thay vì thực thi nó. Bằng cách đó, bạn sẽ có thể thấy nó chính xác như những gì được thấy bởi EXEC
tuyên bố.
Bây giờ đến vấn đề. Bạn nên nhớ rằng bạn không chuyển biến thành SplitValues
mà thay vào đó là nối giá trị của biến vào tập lệnh. Vì giá trị là varchar
, nó nên được nối với dấu ngoặc kép xung quanh nó. Sự vắng mặt của chúng thực sự là vấn đề duy nhất.
Các dấu ngoặc kép xung quanh đối số thứ hai, dấu phẩy, được thoát đúng trong cả hai trường hợp . Vì vậy, chỉ cần sử dụng một trong các phương pháp để thêm dấu ngoặc kép xung quanh đối số đầu tiên:
-
sự lặp lại của dấu ngoặc kép:
DECLARE @year varchar(max), @sql varchar(max); SET @year = '111,11'; SET @sql = 'SELECT * FROM SplitValues(''' + @year + ''','','')'; SELECT @sql;
-
sử dụng
CHAR(39)
:DECLARE @year varchar(max), @sql varchar(max); SET @year = '111,11'; SET @sql = 'SELECT * FROM SplitValues(' + CHAR(39) + @year + CHAR(39) + ',' + CHAR(39) + ',' + CHAR(39) + ')'; SELECT @sql;
Rõ ràng, phương pháp đầu tiên nhỏ gọn hơn, nhưng như tôi đã nói, cả hai đều hoạt động tốt, như bản demo SQL Fiddle này cho thấy rõ ràng.
Tuy nhiên, lưu ý rằng bạn có thể dễ dàng thoát khỏi vấn đề này ngay từ đầu, nếu bạn tha thứ cho cách chơi chữ. Thay vì EXEC ()
, bạn có thể sử dụng EXEC sp_executesql
, cho phép bạn sử dụng tham số . Đây là cùng một tập lệnh được viết lại để sử dụng sp_executesql
:
DECLARE @year varchar(max), @delim char(1);
SET @year = '111,11';
SET @delim = ',';
EXEC sp_executesql
N'SELECT * FROM SplitValues(@year_param,@delim_param)',
N'@year_param varchar(max), @delim_param char(1)',
@year,@delim;
Như bạn có thể thấy, không cần phải lo lắng về việc thoát khỏi các dấu ngoặc kép:SQL Server gặp khó khăn trong việc thay thế các giá trị một cách chính xác, không phải bạn.