2012-07-17 247 views
5

我有一个SQL Server列的类型XML包含一些超过8000个字符的记录。我想将此列转换为varchar如何将超过8000个字符的XML字段转换为字符串?

我不关心截断(前8000个字符是好的)。

然而,每当我试图CONVERT(varchar(8000), Content)我得到一个错误:

Target string size is too small to represent the XML instance

当我尝试CONVERT(varchar(MAX), Content)我得到一个错误:

String or binary data would be truncated

当我尝试CONVERT(varchar(20000), Content)我得到一个错误:

The size (20000) given to the type 'varchar' exceeds the maximum allowed for any data type (8000)

当我尝试CONVERT(text, Content)时出现错误:

Explicit conversion from data type xml to text is not allowed

是否有解决方法?

+2

投射到'varchar(max)'应该可以正常工作。 [就像这样。](http://data.stackexchange.com/stackoverflow/query/75495)。 – 2012-07-17 07:07:38

+0

也许它的配置然后..我当然得到一个错误。 – 2012-07-17 07:23:39

+0

@MikaelEriksson - 发布作为答案,我会接受它。我做了一个愚蠢的事情(我使用convert的特定环境导致了一个冒泡的问题)。 – 2012-07-17 07:27:18

回答

8

演员到varchar(max)应该只是罚款。你可能在别处有一个问题。如果尝试插入/更新数据类型为varchar(8000)的列,则会出现该错误。

+1

问题是将它传递给具有8000最大限制的'hashbytes'函数:-) – 2012-07-17 07:35:34

+0

写了我在这里使用的特定用例:http://mattmitchell.com.au/detecting-duplicate-xml-data -in-SQL服务器/ – 2012-07-22 02:00:55

1

我从未有过这种特殊的需要,但另一种方式我会尝试将

SUBSTRING(CAST(Content AS VARCHAR), 1, 8000) 
+0

这会截断字符串,这可能不是所需的结果。 – 2012-07-17 07:18:42

+0

不幸的是,它试图在您有机会子串之前进行投射>“目标字符串大小太小而无法表示XML实例” – 2012-07-17 07:22:54

+0

忽略我的评论,尽管子字符串是不必要的,但这可能会起作用。 – 2012-07-17 07:27:53

3

您遇到的问题与尝试将xml转换为varchar有关。在尝试将小于您的XML字符串转换为NVARCHAR之前,我遇到过类似的问题。从CONVERT切换到CAST应该可以解决您的问题。只要将尺寸设置为MAX,就可以达到最佳效果。