1

我收到错误:

字符串或二进制数据将被截断。该语句已终止。

通过 Linq-to-SQL 从 C# 将数据插入 SQL Server 2012 列会导致错误XElementXml

运行 Profiler 和其他工具后,我发现 XML 中的属性之一导致了错误:

我在 C# 代码中使用它:

XmlDocument.SchemaVersion = System.Reflection.Assembly.GetAssembly(typeof(Data.Schema.Document)).GetName().Version.ToString();

这应该给出类似的输出

<tst:Root xmlns:tst="http://tempuri.org/some.xsd" SchemaVersion="0.2.1234.12345" RevNumber="1">
...
...
</tst:Root>

但它导致错误被抛出,但这是:

SchemaVersion="3"或者SchemaVersion"0.2.123.1"如果我测试如下:

XmlDocument.SchemaVersion = "0.2.123.1"

SQL Server 中的 XML 列上没有SchemaCollection来强制出错。

SQL Server 是否以某种方式强制SchemaVersion属性为一定长度而无需用户定义,或者为什么我使用的 C# 语句会导致错误?

编辑:

添加了在手动测试时失败并正常工作的示例 Sql

失败:

Insert into XmlTable(XmlId, XmlColumn)
Values('1', '<tst:Root xmlns:tst="http://tempuri.org/some.xsd" SchemaVersion="0.2.1234.12345" RevisionNumber="1" />')

作品:

Insert into XmlTable(XmlId, XmlColumn)
Values('1', '<tst:Root xmlns:tst="http://tempuri.org/some.xsd" SchemaVersion="0.2.1234.1" RevisionNumber="1" />')
4

1 回答 1

1

中指定的数据类型Selective Xml Index导致错误:

string or binary data would be truncated. the statement has been terminated.

生病发布索引,以便如果其他人有问题,也许它会有所帮助。

根据指定的长度检查长度并更改它为我解决了这个问题。

CREATE SELECTIVE XML INDEX [xsi_XmlTable] ON [dbo].[XmlTable]
(
    [XmlColumn]
)
WITH XMLNAMESPACES
(
DEFAULT 'http://tempuri.org/some.xsd'
)

FOR
(
[1] = '/Root' as XQUERY 'node()', 
[2] = '/Root/@SchemaVersion' as SQL [nvarchar](10) SINGLETON 
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90)
GO
于 2013-07-03T19:16:13.693 回答