Оператор print
не выводит нулевые значения. Поскольку tab (col)
уже ссылается на узел /Root/string
, функция col.value('(string/text())[1]', 'VARCHAR(MAX)')
возвращает null.
Если вы реструктурируете свой код таким образом, вы получите желаемый результат печати ...
declare @xmldata xml =N'<?xml version="1.0" encoding="utf-16"?>
<Root>
<string>EBITDA</string>
<string>Products Revenue</string>
</Root>'
Declare @i INT, @cnt INT = @xmldata.value('count(/Root/string)', 'INT')
DECLARE @LineItem VARCHAR(MAX)
SET @i = 1
WHILE @i <= @cnt
BEGIN
SELECT @LineItem = col.value('.', 'VARCHAR(MAX)')
FROM @xmldata.nodes('/Root/string[position() = sql:variable("@i")]') AS tab (col);
PRINT @LineItem
SET @i=@i+1
END
EBITDA
Products Revenue
Если вы хотите использовать результаты в чем-то другом, вы можете вернуть такой набор результатов:
declare @xmldata xml =N'<?xml version="1.0" encoding="utf-16"?>
<Root>
<string>EBITDA</string>
<string>Products Revenue</string>
</Root>';
select col.value('.', 'VARCHAR(MAX)') as LineItem
from @xmldata.nodes('/Root/string') as tab (col);
LineItem
----------------
EBITDA
Products Revenue
(2 rows affected)