2011-01-30 14 views
7

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)?

+1

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

+0

@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. –

Trả lời

2

Máy chủ SQL không có tùy chọn như vậy. Bạn sẽ phải tự kiểm tra độ dài của chuỗi trong thủ tục lưu trữ của bạn và bằng cách nào đó xử lý các chuỗi dài hơn hoặc sử dụng tùy chọn nvarchar (tối đa). Nếu không gian đĩa không phải là vấn đề thì tùy chọn nvarchar (max) chắc chắn là giải pháp dễ nhất và nhanh nhất.

+0

Tôi đã nghi ngờ rằng đây là trường hợp nhưng tôi nghĩ rằng tôi muốn hỏi anyway. Cảm ơn bạn đã xác nhận sự nghi ngờ của tôi. –

1

Tôi không biết cách nào để làm cho máy chủ làm điều đó, nhưng tôi đã sử dụng tính năng SQL Server Projects của Visual Studio Team System Developer Edition. Nó bao gồm các phân tích mã mà bắt gặp một vấn đề cắt ngắn của tôi: sử dụng một tham số int để chèn vào một cột smallint.

0

Bạn có thể sử dụng LEFT trong SQL và chỉ định độ dài mà bạn muốn chèn. Ví dụ: .

CREATE TABLE Table1 ( kiểm tra varchar (10) )

chèn vào giá trị Table1 (LEFT ('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 10))

này sẽ chèn chỉ

abcdefghij trên bàn

+0

Câu hỏi đặt ra là hỏi cách * ngăn chặn * SQL từ các chuỗi cắt xén ngầm và âm thầm được truyền vào Thủ tục lưu sẵn. Câu trả lời này cho biết cách cắt ngắn chuỗi một cách rõ ràng. * Nếu * Hành vi của máy chủ SQL khác nhau và câu hỏi là "làm cách nào để ngăn chặn lỗi khi tôi chuyển một chuỗi quá dài", đây sẽ là câu trả lời có thể áp dụng. – Timbo

Các vấn đề liên quan