sql – 如何确定哪些字符串或二进制数据将被截断?
发布时间:2020-05-24 04:36:34 所属栏目:MsSql 来源:互联网
导读:我有一个大多数时间都可以运行的存储过程,但是每次都会收到一条错误消息: Msg 8152, Level 16, State 2, Line 98String or binary data would be truncated.The statement has been terminated. 如何确定导致此问题的数据字符串? 对于这个能够很好地处理更
|
我有一个大多数时间都可以运行的存储过程,但是每次都会收到一条错误消息: Msg 8152,Level 16,State 2,Line 98 String or binary data would be truncated. The statement has been terminated. 如何确定导致此问题的数据字符串? 解决方法对于这个能够很好地处理更复杂的选择查询的答案,让我们假设我们有三个表定义如下……CREATE TABLE [dbo].[Authors](
[AuthorID] [int] NOT NULL,[AuthorName] [varchar](20) NOT NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[Books](
[BookID] [int] NOT NULL,[AuthorID] [int] NOT NULL,[BookName] [varchar](20) NOT NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[Publications](
[BookID] [int] NOT NULL,[PublicationName] [varchar](10) NOT NULL,[WrittenBy] [varchar](10) NOT NULL
) ON [PRIMARY]
…我们创建以下数据…… INSERT INTO Authors ( AuthorID,AuthorName ) VALUES ( 1,'BOB' ) INSERT INTO Authors ( AuthorID,AuthorName ) VALUES ( 2,'JANE' ) INSERT INTO Authors ( AuthorID,AuthorName ) VALUES ( 3,'SOREN LONGNAMESSON' ) INSERT INTO Books ( BookID,AuthorID,BookName ) VALUES ( 1,1,'My Life' ) INSERT INTO Books ( BookID,BookName ) VALUES ( 2,2,'Writing Long Titles For Dummies' ) INSERT INTO Books ( BookID,BookName ) VALUES ( 3,3,'Read Me' ) …而我们抛出错误的复杂查询是…… INSERT INTO Publications SELECT Books.BookID,Books.BookName,Authors.AuthorID,Authors.AuthorName FROM Books JOIN Authors ON Books.AuthorID = Authors.AuthorID …然后我们可以找到可能像这样冒犯的列…… 步骤1 SELECT Books.BookID,Authors.AuthorName INTO ##MyResults FROM Books JOIN Authors ON Books.AuthorID = Authors.AuthorID 第2步 SELECT
SourceColumns.[name] AS SourceColumnName,SourceColumns.[type] AS SourceColumnType,SourceColumns.[length] AS SourceColumnLength,DestinationColumns.[name] AS SourceColumnName,DestinationColumns.[type] AS SourceColumnType,DestinationColumns.[length] AS SourceColumnLength
FROM
tempdb.sys.syscolumns SourceColumns
JOIN tempdb.sys.sysobjects SourceTable ON SourceColumns.[id] = SourceTable.[id]
LEFT JOIN sys.syscolumns DestinationColumns ON SourceColumns.colorder = DestinationColumns.colorder
LEFT JOIN sys.sysobjects DestinationTable ON DestinationColumns.[id] = DestinationTable.[id]
WHERE
SourceTable.Name = '##MyResults'
AND DestinationTable.Name = 'Publications'
您可以调整此查询以过滤到某些列类型(您知道问题是字符串或二进制数据)以及源列的长度大于目标列的位置.有了这些信息,您应该只留下一些可能导致截断的列,并可以从那里开始搜索. 小费!检查您的目标列是否有ON INSERT TRIGGERS! (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- SQL Server SQL学习笔记八 索引,表连接,子查询,ROW_NUMB
- SQL服务器无法启动的解决方法
- 数据库 – 如何查找记录oracle的分区
- sql-server – 不能模式绑定视图MyName’,因为名称MyTable对
- sql – 在LEFT JOIN和WHERE中计数
- SQL Server SQL语句 一个简单的字符串分割函数
- 经常更改的数据库的最佳.NET解决方案
- CentOS 7下MongoDB的安装配置详解
- sql-server – 无法通过SQL Server Express Management Stu
- sql-server – SQL Server事务日志资源管理器/分析器[已关闭
