3

sum ノードの値について質問します。

SQL Server 2008 のいくつかの xml ノード値を合計する

このコードを検討してください:

Declare @xml xml 
set @xml='<Parent ID="p">
     <Child ID="1">1000000000</Child > 
     <Child ID="2">234650</Child > 
     <Child ID="3">0</Child > 
      </Parent >'

Select @xml.value('sum(/Parent[@ID="p"]/Child)','bigint') as Sum

これを実行すると、次のエラーが再実行されます。

メッセージ 8114、レベル 16、状態 5、行 8 データ型 nvarchar を bigint に変換中にエラーが発生しました。

問題は、この値を返すことです:1.00023465E9

上記のクエリをこのように変更すると、問題ありません。

Declare @xml xml 
set @xml='<Parent ID="p">
     <Child ID="1">1000000000</Child > 
     <Child ID="2">234650</Child > 
     <Child ID="3">0</Child > 
      </Parent >'

Select @xml.value('sum(/Parent[@ID="p"]/Child)','float') as Sum

なぜSql Serverがこれを行うのですか?

4

4 に答える 4

4

Sql Server では、xpath クエリを実行したときに発生するように、科学表記法を使用して値を文字列から整数に変換する際に問題が発生しますが、float.

次のようにクエリを記述できます。

select @xml.value('sum(/Parent[@ID = "p"]/Child) cast as xs:long?', 'bigint')
于 2013-04-22T11:34:18.580 に答える
2

これを試してみてください -

DECLARE @xml XML 
SELECT @xml='<Parent ID="p">
     <Child ID="1">1000000000</Child > 
     <Child ID="2">234650</Child > 
     <Child ID="3">0</Child > 
      </Parent >'

SELECT @xml.value('sum(for $r in /Parent[@ID="p"]/Child return xs:int($r))', 'bigint')

アップデート:

DECLARE @xml XML 
SELECT @xml='<Parent ID="p">
     <Child ID="1">100000000000000</Child > 
     <Child ID="2">234650</Child > 
     <Child ID="3">0</Child > 
      </Parent >'

SELECT @xml.value('sum(for $r in /Parent[@ID="p"]/Child return xs:decimal($r))', 'bigint')

更新 2:

DECLARE @xml XML 
SELECT @xml='<Parent ID="p">
     <Child ID="1">100000000000000.6</Child > 
     <Child ID="2">234650</Child > 
     <Child ID="3">0</Child > 
      </Parent >'

SELECT @xml.value('sum(for $r in /Parent[@ID="p"]/Child return xs:decimal($r))', 'decimal(18,2)')
于 2013-04-22T11:34:03.193 に答える
0

これを試してみてください BIGINT で動作しています:

DECLARE @SearchKeyWords XML 

SET @SearchKeyWords =
'<Parent ID=''p''>
    <Child ID="1">1000000000</Child > 
    <Child ID="2">234650</Child > 
    <Child ID="3">0</Child > 
</Parent >' 

DECLARE @TempSearchKeyWords TABLE
        (
            SearchKeyWord BIGINT
        )

INSERT INTO @TempSearchKeyWords                     
SELECT SearchKeyWords.SearchKeyword.value('.',' bigint ') AS SearchKeyword             
FROM @SearchKeyWords.nodes('/Parent/Child') AS SearchKeyWords(SearchKeyword)

SELECT SUM(SearchKeyWord) FROM @TempSearchKeyWords
于 2013-04-22T11:27:20.620 に答える
0

ここにある XML は、型指定されていない XML です。これは、 に提供される値sum()が type であることを意味しますxdt:untypedAtomicsum()値で が使用されると、にxdt:untypedAtomicキャストされxs:doubleます。の結果は関数によって文字列 (または untypedAtomic) としてsum()読み取られ、値が 1.0E-6 未満、または 1.0E6 以上の場合は科学表記法が使用されます。SQL Server は科学表記法からまたはに変換できません。values()xs:doubleintbigint

参照:
sum 関数 (XQuery) XQuery
の型キャスト規則

他の回答では、入力値または結果をキャストする、またはのデータ型としてsum()使用する回避策が提供されています。別のオプションとして、代わりに型付き XML を使用することもできます。floatvalues()

スキーマ:

create xml schema collection XSDSumTest as '
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Parent">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Child" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:int">
                                <xs:attribute name="ID" type="xs:int"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="ID" type="xs:string"/>
        </xs:complexType>
    </xs:element>
</xs:schema>'

クエリ:

declare @xml xml(XSDSumTest) = '
<Parent ID="p">
  <Child ID="1">1000000000</Child > 
  <Child ID="2">234650</Child > 
  <Child ID="3">0</Child > 
</Parent>'

select @xml.value('sum(/Parent[@ID="p"]/Child)','bigint') as Sum
于 2013-04-23T06:03:51.963 に答える