问题描述
我有一个将记录放入表的过程,具体说来是
从字段数据类型money
到字段数据类型numeric(11,0)
insert into tab1(decimal_field_1)
select convert(numeric(11,0),money_field_1)
from tab2
执行后,我得到警告信息:
状态8的状态16的Msg 8152 字符串或二进制数据将被截断
我有意识地将该列从money
转换为decimal(11,0)
,并且我不想使用set ansi_warnings OFF
。
那我怎么办?如何正确转换数据?
解决方法
该错误通常与截断字符串(例如varchar,nvarchar)有关,而不是数字(例如,字符串太长而无法容纳)。
如果我的货币值转换为数值(11,0)太大,则会出现错误Msg 8115,Level 16,State 8,Line 5 Arithmetic overflow error converting money to data type numeric.
因此,错误不太可能由CONVERT触发,而是在INSERT中触发。您可以通过执行select convert(numeric(11,0),money_field_1) from tab2
来进行测试,该方法应该可以正常工作-显示CONVERT很好。
您只插入1列十进制字段_1吗?
- 如果是这样,您确定十进制字段_1也是数字(11,0)而不是varchar或nvarchar吗?
- 如果要插入其他列,请检查其他字段。错误可能来自那里。
不推荐使用money数据类型一段时间。看看有关如何避免这种情况的article。
“钱在-922,337,203,685,477.5808(-922,337 万亿)和922,477.5807(922,337万亿)”
尝试使用DECIMAL(19,4)
private void Button_Click(object sender,RoutedEventArgs e)
{
IHTMLDocument2 doc = webBrowser.Document as IHTMLDocument2;
if (doc != null)
{
StringBuilder html = new StringBuilder(doc.body.outerHTML);
dynamic document = webBrowser.Document;
string str = document.getElementById("sb_form_q").value;
var words = new[] { str,"Bing" };
foreach (String key in words)
{
String substitution = "<span style='background-color: rgb(255,255,0);'>" + key + "</span>";
html.Replace(key,substitution);
}
doc.body.innerHTML = html.ToString();
document.getElementById("sb_form_q").value = str;
}
}