我最近在将应用程序移植到SQL Server时遇到了问题.事实证明,这个问题是由于存储过程参数被声明为传递给它的数据太短造成的:参数被声明为VARCHAR(100)但在一种情况下传递了超过100个字符的数据.让我感到惊讶的是,SQL Server没有报告任何错误或警告 - 它只是默默地将数据截断为100个字符.
以下SQLCMD会话演示了这一点:
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'.
局部变量也表现出相同的行为:
1> declare @s varchar(5) = '123456789'; 2> print @s; 3> go 12345
是否有一个选项,我可以在这种情况下启用SQL Server报告错误(或至少警告)?或者我应该将所有局部变量和存储过程参数声明为VARCHAR(MAX)或NVARCHAR(MAX)?
SQL Server 没有这样的选项。您必须手动检查存储过程中字符串的长度并以某种方式处理较长的字符串,或者使用 nvarchar(max) 选项。如果磁盘空间不是问题,那么 nvarchar(max) 选项无疑是最简单、最快的解决方案。