Jamie888 Ответов: 0

OPENXML работает с/без корневого элемента?


Привет, у меня есть 2 хранимые процедуры, разработанные предыдущими разработчиками в моей команде. Хранимая процедура 1 заключается в извлечении записей и приведении их в формат XML. Хранимая процедура 2 будет принимать выходные данные в качестве входных параметров и использовать их для создания других записей. Логика проста и но одна вещь утомительна заключается в следующем:
SELECT   
	CAST 
	(   
		(
			SELECT DISTINCT
				c.FirstName
			FROM   
				CustomerDetail.Customer AS c
				 XML RAW('FirstName'), ROOT('CustomerDetails')  
   
		) AS VARCHAR(MAX)
	)


Итак, из приведенного выше SQL-оператора я бы получил что-то вроде:
<CustomerDetails><FirstName>John</FirstName></CustomerDetails>


Хорошо, это будет передано в хранимую процедуру 2 в качестве входного параметра:
DECLARE @hdoc AS INT;  
EXEC sp_xml_preparedocument   
	 @hdoc OUTPUT  
	,@p_FirstNames --The above XML syntax
  
DECLARE @CustomerDetail TABLE 
(   
	FirstName VARCHAR(100)
)   
         
INSERT INTO 
@CustomerDetail 
SELECT   
*  
FROM   
OPENXML(@hdoc,'/ROOT/CustomerDetails/FirstName',1) WITH(FirstName VARCHAR(100))


Затем я просто выберу * из @CustomerDetail, и то, что я получу, будет пустой таблицей без первого имени, которое я передал.
Хотя я знаю, где проблема(из-за отсутствия корня в моем входном параметре), но я не могу понять, почему приложение, использующее вышеупомянутую хранимую процедуру 2, работает правильно(все бизнес-логики) без каких-либо несоответствий данных/проблем интеграции/и т. д. вообще за все это время.

Что я уже пробовал:

1. Добавить корень на вход парам и он способен генерировать отчеты. В данном случае, Джон.
2. Удалите корень снова, Джон "исчезнет".
3. логика, работающая сейчас(уже много лет), прекрасна, данные способны генерироваться(без корневого элемента).
4. Посмотрел сайт Microsoft, все показанном примере имеет корневой элемент.

0 Ответов