1

У меня есть проблема с использованием функции openxml в моей хранимой процедуре, как вы можете видеть, инструкция select возвращает пустую строку. Я подозреваю, что sql не смог прочитать xml-каталоги. Это первый раз, когда я использую эту функцию, поэтому я не уверен, что это правильный способ использования it.btw. Я использую SQL Server 2008 r2. вот код для воспроизведения проблемы.SELECT * FROM OPENXML В STORED PROCEDURE возвращает пустую строку

Declare @hddoc int 
Declare @Doc xml 

SET @Doc = ' <DataSet> 
    <tblEmp> 
     <name>Nazri</name> 
     <designation>Developer</designation> 
    </tblEmp> 
    <tblEmp> 
     <name>Jibin</name> 
<designation>System Analyst</designation> 
    </tblEmp> 
      </DataSet>' 

EXEC SP_XML_PREPAREDOCUMENT @hddoc OUTPUT, @Doc 

SELECT @hddoc 

DECLARE @iDoc INT 
SET @iDoc = 1 

SELECT * 
FROM OPENXML(@iDoc,'/Dataset/tblEmp') 
    WITH (name varchar(50) '@name', 
    designation varchar(50) '@designation' 
    ) 
+0

Я понимаю, что это просто ходячий пример, но когда вы делаете производство кода готовы не забудьте позвонить 'sp_xml_removedocument' освободить ручку документа или иначе это приведет к утечка ресурса – Tedford

ответ

0

Проблема заключается в том, что отображаемое табличное отображение указывает, что значения должны быть атрибутами; однако в XML они являются элементами. Измените свой оператор OPENXML следующим образом, и он должен вернуть ожидаемые результаты.

SELECT * FROM OPENXML(@iDoc,'/DataSet/tblEmp',2) 
    WITH (name varchar(50) 'name', 
    designation varchar(50) 'designation' 
    ) 

В основном эти два изменения состоят в том, чтобы указать элементное сопоставление элементов и обновить относительный xpath до поиска элементов вместо атрибутов.

+0

это работает !. но могу ли я использовать его так, как это в моем магазине procs, вызвав xml с помощью openrowset? это то, как предполагается использовать его, но пока это не работает. вы можете попробовать? спасибо Тед. --- выбрать из набора строк здесь INSERT INTO tblEmp - (название, обозначение) SELECT * FROM OPENXML (@HANDLE, '/ Dataset/tblEmp') С (имя VARCHAR (50) 'имя', обозначение VARCHAR (50) 'обозначение') –

+0

У вас все еще есть 'Dataset' вместо' DataSet'. –

+0

@MuhammadNazri Да 'openxml' может использоваться в хранимой процедуре. Мой типичный вариант использования заключался в том, чтобы подталкивать пакет изменений в SP в формате XML, тогда proc может делать все, что бизнес-логика отключена от этого набора данных. – Tedford

0

Измените свой запрос на:

CREATE PROCEDURE AddData 
(@data XML) 
AS 
BEGIN 
DECLARE 
    @handle INT, 
    @PrepareXmlStatus INT 

EXEC @PrepareXmlStatus= sp_xml_preparedocument @handle OUTPUT, @Data 

INSERT INTO tblEmp (name,designation) 
SELECT * 
FROM OPENXML(@handle,'/DataSet/tblEmp',2) 
    WITH (name varchar(50) 'name', 
      designation varchar(50) 'designation') 

EXEC sp_xml_removedocument @handle 

END 
+0

спасибо брату? но один вопрос, но как я могу использовать его с openrowset? что я имею в виду, я хочу вызвать xml-файл с диска, открыть его с помощью openxml и затем вставить его в таблицу. Могу ли я использовать его вот так? INSERT INTO tblEmp - (имя, обозначение) SELECT * FROM OPENXML (@HANDLE, '/ Dataset/tblEmp') С (имя VARCHAR (50) 'имя', обозначение УАКСНАК (50) 'обозначение') –

+0

Я меняю его на хранимую процедуру. Надеюсь, это то, что вам нужно. –