Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Определить, содержит ли XML непустые атрибуты или элементы  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Таблица содержит поле XML, в которое вставляется документ, соответствующий определённой схеме. Часто бывает, что вставляемый XML содержит пустые атрибуты или элементы, типа
<CurrentInfo number="">
  <Availability />
<CurrentInfo>

Требуется создать функцию для проверки наличия непустых значений атрибутов или элементов.

Подскажите, кто может.
14 июн 11, 16:50    [10811634]     Ответить | Цитировать Сообщить модератору
 Re: Определить, содержит ли XML непустые атрибуты или элементы  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Перед тем как вставлять данные в базу, удалите ненужный мусор и будет вам щасье.
Ещё лучше его не генерировать.

+ Ответ, для глухих и упёртых
Что-то типа:
CREATE FUNCTION [dbo].[fnXMLUtils] (
	@XML	XML
) RETURNS TABLE AS RETURN
SELECT	 @XML.exist('//@*[text() = ""]')	AS HasEmptyAttributes
	,@XML.exist('//*[text() = ""]')		AS HasEmptyElements
GO
Ещё с data(.) попробовать, есть нюансы (для элементов) и планы посмотреть надо
15 июн 11, 00:15    [10813588]     Ответить | Цитировать Сообщить модератору
 Re: Определить, содержит ли XML непустые атрибуты или элементы  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Не работает, но за идею спасибо.
Получилось такое:

CREATE FUNCTION [dbo].[XmlIsEmpty] 
(
	@InputXml xml
)
RETURNS bit
AS
BEGIN
	DECLARE @Result bit = 1
	
	IF @InputXml.exist('//*[.!=""]') = 1 OR @InputXml.exist('//*[@*!=""]') = 1
		SET @Result = 0

	RETURN @Result

END
16 июн 11, 13:00    [10821288]     Ответить | Цитировать Сообщить модератору
 Re: Определить, содержит ли XML непустые атрибуты или элементы  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Вы не поняли почти всё.
1. Проблема архитектуры.
2. Универсальная функция
3. Не тормозит как скалярка
Быдлокод. Как обычно не могут исправить ошибку и изобретают.

CREATE FUNCTION [dbo].[fnXMLUtils] (
	@XML	XML
) RETURNS TABLE AS RETURN
SELECT	 @XML.exist('//@*[data(.) = ""]')	AS HasEmptyAttributes
	,@XML.exist('//*[data(.) = ""]')	AS HasEmptyElements
	,@XML.exist('//@*[data(.) = ""]')
	|@XML.exist('//*[data(.) = ""]')	AS HasEmpty
GO
Только data хуже чем text (это я спецам, для вас одинаково).

IF - процедурномыслие задолбало
16 июн 11, 13:42    [10821657]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить