执行视图SELECT语句时遇nvarchar转int失败错误,请求排查原因
为啥会出现这个转换错误?我来给你捋清楚
你的错误提示 Conversion failed when converting the nvarchar value 'XYZ' to data type int,核心问题出在UNION ALL的规则上——它要求两个查询返回的结果集里,对应位置的列必须数据类型兼容,而你的SQL刚好违反了这个规则。
具体来说:
- 你写的
SELECT Firm = '4', * FROM ...和SELECT Firm = '3', * FROM ...,用UNION ALL合并结果时,系统会逐列对比两个表的列类型。 - 错误里的'XYZ'是字符串类型,但系统硬要把它转成整数,说明两个
tbl_SparePart表中,某个对应位置的列类型不匹配:比如第一个表的某列是int,第二个表同位置的列是nvarchar,而且这个nvarchar列里有'XYZ'这种非数字内容;或者反过来,第一个表是nvarchar,第二个是int,但第一个表有非数字值。
怎么解决?按这几步来
先搞清楚两个表的结构差异
先查一下两个表的列类型,看看哪列不匹配:-- 查第一个表的列结构 SELECT COLUMN_NAME, DATA_TYPE FROM CRT.TANKER.DBO.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tbl_SparePart'; -- 查第二个表的列结构 SELECT COLUMN_NAME, DATA_TYPE FROM CRT_BULK.BULK.DBO.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tbl_SparePart';重点找int和nvarchar类型对应的列,就是它们搞的鬼。
手动统一列的数据类型
找到不兼容的列后,得显式转换类型让两边一致。比如如果第二个表的PartCode是nvarchar,第一个表的是int,那可以把第一个表的PartCode转成nvarchar(别反过来转,除非你能保证第二个表的PartCode全是数字,不然还是转成字符串更安全):SELECT Firm = '4', CAST(PartCode AS NVARCHAR(50)), -- 把int转成字符串 PartName, -- 其他列按顺序列出来 FROM CRT.TANKER.DBO.tbl_SparePart UNION ALL SELECT Firm = '3', PartCode, -- 本身就是nvarchar,不用转 PartName, -- 其他列和左边对应 FROM CRT_BULK.BULK.DBO.tbl_SparePart;别用
*了,把列名一个个写出来
用*真的很容易踩坑——万一哪天表结构改了,列顺序变了,类型不匹配的问题又会冒出来。显式列所有需要的列,能精准控制每一列的类型和顺序,也方便排查问题:-- 推荐写法:明确列名+类型转换 SELECT Firm = '4', PartCode = CAST(PartCode AS NVARCHAR(50)), PartName, StockQty, Price FROM CRT.TANKER.DBO.tbl_SparePart UNION ALL SELECT Firm = '3', PartCode, PartName, StockQty, Price FROM CRT_BULK.BULK.DBO.tbl_SparePart;
一句话总结
就是UNION ALL要求两边结果集的列类型必须完全兼容,你的两个备件表有类型不匹配的列,而且其中一列存在无法转成整数的字符串值。按上面三步操作,就能搞定这个问题啦。
内容的提问来源于stack exchange,提问作者yılmaz güney
相关产品推荐
相关产品推荐

