xquery value演算子を使用してxml属性から値を取得する場合、欠落している属性はnullとして返されます。頼らずに同じことをする方法はありCASE WHEN N.exists('path')=0 THEN NULL ELSE n.value('path') END
ますか?
このSQL:
DECLARE @val xml
SET @val = '<records>
<record attrval="attrval">
<stringvalue>some value</stringvalue>
<intvalue>1</intvalue>
</record>
<record>
<intvalue>1</intvalue>
</record>
<record>
<stringvalue>another value</stringvalue>
</record>
</records>'
SELECT N.query('stringvalue').value('/', 'varchar(100)') AS stringvalue,
N.query('intvalue').value('/', 'int') AS intvalue,
N.value('@attrval', 'varchar(100)') AS attrval
FROM @val.nodes('//record') as T(N)
結果:
[stringvalue] [intvalue] [attrval]
some value 1 attrval
1 NULL
another value 0 NULL
そして私は取得したいと思います:
[stringvalue] [intvalue] [attrval]
some value 1 attrval
NULL 1 NULL
another value NULL NULL
行わずに:
SELECT CASE WHEN N.exists('stringvalue')=1 THEN N.query('stringvalue').value('/', 'varchar(100)') ELSE NULL END AS stringvalue,
CASE WHEN N.exists('intvalue')=1 THEN N.query('intvalue').value('/', 'int') ELSE NULL END AS intvalue,
N.value('@attrval', 'varchar(100)') AS attrval
FROM @val.nodes('//record') as T(N)
この場合、SQL Serverによって課される属性の長さに制限があり、一部のデータがそれを超えるため、属性値だけを使用できないことに注意してください。
また、関連する質問がありますが、空と欠落を区別する必要があるため、答えは当てはまりません。SQLServerxQueryは空ではなくNULLを返します