执行过程时出现此错误
消息8152,级别16,状态2,过程SP_xxxxx,第92行字符串或 二进制数据将被截断。
我创建了一个临时表,该程序将在过程中从主表中加载一次数据,由于主表具有大量数据和许多不必要的列,因此我将使用该表而不是主表。
当我从sql server management studio中运行以下代码时,则没有错误,但是当我从过程中运行此代码时,则它们是上述错误消息。
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
TextBox_SimPassword.IsEnabled = false;
Label_SimPassword.IsEnabled = false;
}
private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
TextBox_SimPassword.IsEnabled = true;
Label_SimPassword.IsEnabled = true;
}
答案 0 :(得分:2)
检查此问题的一种方法是查看每个值的长度
假设您有如下表格
create table t
(
col1 varchar(10),
col2 varchar(10)
)
插入表失败,如果您尝试插入10个以上的字符,如果您尝试将它们批量插入,则不会得到有问题的值。
因此,您需要在插入前检查其长度,如下所示
;with cte
as
(
select
len(col1) as col1,
len(Col2) as col2
from table
)
select * from cte where col2>10
Microsoft提出了许多增强错误消息的请求,它们终于在SQL2019中解决了此问题。
现在您可以获得引起问题的确切值
参考文献:
https://voiceofthedba.com/2018/09/26/no-more-mysterious-truncation/
答案 1 :(得分:2)
我怀疑您在存储过程中looking at the wrong line of code。
当您打开proc,即ALTER...
时,您在存储的proc上有一个标头,它将把行号扔掉。
如果运行此命令,请用您的过程名称替换proc_name
:
sp_helptext proc_name
如果将其粘贴到新窗口中,它将为您提供该过程实际运行的代码,并提供准确的行号。
然后,您将看到实际错误发生的位置。
如果您想要一种简单的方法来证明这一理论,请在您认为导致错误的代码周围放一堆Print 'some sql 1'
,Print 'some sql 2'
行,并查看引发错误时的输出