Gần đây tôi đã gặp sự cố khi chuyển ứng dụng sang SQL Server. Nó chỉ ra rằng vấn đề này là do một tham số thủ tục lưu trữ được khai báo quá ngắn cho dữ liệu được truyền cho nó: tham số được khai báo là VARCHAR(100)
nhưng trong một trường hợp đã được truyền hơn 100 ký tự dữ liệu. Điều làm tôi ngạc nhiên là SQL Server không báo cáo bất kỳ lỗi hoặc cảnh báo nào - nó chỉ lặng lẽ cắt ngắn dữ liệu thành 100 ký tự.Có cách nào để ngăn chặn SQL Server âm thầm cắt ngắn dữ liệu trong các biến địa phương và các tham số thủ tục lưu trữ?
Phiên SQLCMD sau minh họa này:
1> create procedure WhereHasMyDataGone (@data varchar(5)) as 2> begin 3> print 'Your data is ''' + @data + '''.'; 4> end; 5> go 1> exec WhereHasMyDataGone '123456789'; 2> go Your data is '12345'.
biến địa phương cũng thể hiện hành vi tương tự:
1> declare @s varchar(5) = '123456789'; 2> print @s; 3> go 12345
Có một lựa chọn Tôi có thể kích hoạt để có sai sót báo cáo SQL Server (hoặc ít nhất cảnh báo) trong những tình huống như vậy? Hoặc tôi có nên khai báo tất cả các biến cục bộ và tham số thủ tục được lưu trữ dưới dạng VARCHAR(MAX)
hoặc NVARCHAR(MAX)
?
Bản sao của [SQL Server âm thầm cắt bớt varchar trong các thủ tục được lưu trữ] (http://stackoverflow.com/questions/4628140/sql-server-silently-truncates-varchars-in-stored-proced ures). Bạn ** không thể ** làm điều đó. – gbn
@gbn: Cảm ơn bạn đã phát hiện bản sao - xin lỗi vì không tự mình phát hiện ra. –