2017-02-21 41 views
0

Я новичок в этом, поэтому, пожалуйста, несите меня. Я пытаюсь передать некоторые XML-данные в Microsoft SQL Server. Я предполагаю, что эти данные должны передаваться как элементы, а не атрибуты, потому что содержимое столбцов не будет статическим.Пытается передать XML-данные в SQL как элементы (не атрибут)

Однако по какой-то причине, когда я пытаюсь передать данные в качестве элементов, я получаю значения NULL. Но когда я пытаюсь передать эти же данные как атрибуты, он работает и выглядит так, как предполагается. Я испытываю соблазн пожать плечами и просто двигаться дальше, но я беспокоюсь, что для меня это может пойти наперекосяк, если я сделаю это позже по дороге.

У меня уже есть некоторые атрибуты из этого XML, которые мне удалось передать как атрибуты, которые я планирую объединить с этими элементами, которые маскируются как атрибуты в одну таблицу. Это будет работать? И если это произойдет, будут проблемы в будущем?

Вот мой SQL-код, когда я пытаюсь передать элементы в качестве элементов:

SELECT * 
FROM OPENXML (@hdoc, '/roll/voter', 2) 
WITH (
id int, 
[value] char(50), 
[state] char(2)) 

Вот мой SQL-код, когда я пытаюсь передать элементы в качестве атрибутов:

SELECT * 
FROM OPENXML (@hdoc, '/roll/voter', 1) 
WITH (
id int, 
[value] char(50), 
[state] char(2)) 

Вот миниатюризированная версия документа XML:

<roll> 
<voter id="400048" value="Yea" state="FL" /> 
<voter id="412516" value="Yea" state="CA" /> 
</roll> 

Ссылка на xml d ocument через Google диск (очень маленький XML): https://drive.google.com/open?id=0B5VgOwWcGeLHaWctRU56Qlk3UWM

A screenshot of my SQL query, the table results, and the XML

+0

Не уверен, чего вы пытаетесь достичь, но правильный синтаксис для первого: 'FROM OPENXML (@hdoc, '/ roll/voter', 2) WITH (id int '@id', [value] char (50) '@value', [state] char (2) '@state') 'или что-то в этом роде. – ZLK

+0

@ZLK Используя псевдонимы, я смог выполнить передачу в качестве элементов. Нужны ли алиасы, чтобы элементы работали, но не нужны для атрибутов? –

+0

Я не уверен, что понимаю, почему псевдонимы были необходимы для первого запроса. –

ответ

1

FROM OPENXML устарела и не должна использоваться больше (существуют редкие исключения) ...

Попробуйте с реальных методов XML:

DECLARE @xml XML= 
N'<roll> 
<voter id="400048" value="Yea" state="FL" /> 
<voter id="412516" value="Yea" state="CA" /> 
</roll>'; 

SELECT @xml.value(N'(/roll/voter/@id)[1]',N'int') AS voter_id 
     ,@xml.value(N'(/roll/voter/@value)[1]',N'nvarchar(max)') AS voter_value 
     ,@xml.value(N'(/roll/voter/@state)[1]',N'nvarchar(max)') AS voter_state 

результат

voter_id voter_value voter_state 
400048  Yea   FL