web-dev-qa-db-ja.com

SQL ServerでTEXTをXMLにキャストできません

基本的に、XMLという名前のTEXTという名前の列があります。これは他の理由で変更することはできませんが、どうすればXMLにキャストできるのかと思っていました。

エラーが出ます

XML解析:行1、文字39、エンコードを切り替えることができません

これをしようとするとき。それをXMLにフォーマットするためにまだ周りにありますか?私はこの時点で本当に行き詰まっています。

列内のデータ:

<?xml version="1.0" encoding="utf-16"?>
<Record>
     <UserGuid>c624a356-9f18-403c-b404-790e79034c7d</UserGuid>
</Record>

キャストSQLコードは次のとおりです。

SELECT CAST(XML AS XML).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)')
FROM tbl_Module_RequestForms_Items
32
the sandman

あなたの問題は、XMLに_encoding="utf-16"_がありますが、列が非Unicode列である......

NTEXTにも変更できないと仮定すると、ネストされた2つのCASTを実行して、探しているものを実現する必要があります。

_SELECT 
    CAST(CAST(XML AS NTEXT) AS XML).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)')
FROM 
    tbl_Module_RequestForms_Items
_

まず、NTEXT(またはNVARCHAR(MAX))にキャストする必要があります。次に、その結​​果を使用する前にXMLにキャストする必要があります。

Tip:これらの「その他の理由」を削除し、XMLとして使用する必要がある場合は、これをXMLデータ型に変換します.....

52
marc_s

_encoding="utf-16"_を_encoding="utf-8"_または''(blank)に置き換えてから、操作を実行する必要があります。

a。 _encoding="utf-16"_を_encoding="utf-8"_に変換

_SELECT 
  CAST(
    REPLACE(CAST([xml] AS VARCHAR(MAX)), 'encoding="utf-16"', 'encoding="utf-8"')
  AS XML).value('(/Record//UserGuid/node())[1]', 'NVARCHAR(max)') as UserGuid
from tbl_Module_RequestForms_Items
_

b。 _encoding="utf-16"_を''(blank)に置き換える

_SELECT 
  CAST(
    REPLACE(CAST([xml] AS VARCHAR(MAX)), 'encoding="utf-16"', '')
  AS XML).value('(/Record//UserGuid/node())[1]', 'NVARCHAR(max)') as UserGuid
from tbl_Module_RequestForms_Items
_
34
Elias Hossain

XML変数をNTEXTとしてキャストすると、CAST(CAST (XML AS NTEXT) AS XML)の問題が解決します。

3
Mick

Encoding = "utf-8"をencoding = "utf-16"に置き換えるとうまくいきました。 :)

0
M. Fawad Surosh