вставка узла в тип данных SQL 2008 xml ... проверка, существует ли он первым - PullRequest
3 голосов
/ 16 июля 2010

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

Итак, у меня есть поле XML в SQL 2008. В основном оно содержит что-то вроде:

<root><id>1</id><id>4</id></root> и так далее ...

То, что я надеюсь сделать, это передать параметр в proc для вставки значения, ЕСЛИ его не существует ..

Так что вместо того, чтобы сначала прочитать xml и сделать это, скажем, в .NET-коде, есть ли чистый способ сделать это внутри хранимого proc / t-sql ???

Любая помощь приветствуется! Я уверен, что это довольно распространенный!

Ответы [ 2 ]

1 голос
/ 16 июля 2010

Вы можете использовать функцию .exist() XQuery в своем XML, чтобы узнать, существует ли данный узел или нет.

Извлечение Обзор поддержки XML в SQL Server 2005 - это отличная статья о том, как использовать различные доступные функции XQuery. Сразу после середины этой страницы вы найдете этот раздел:

Используя существующий метод

Существующий метод требует XPath выражение, которое выбирает один узел в XML-документе и возвращает либо True (значение бита 1), если узел существует или False (значение бита 0), если оно не. Если исходный столбец типизированный столбец xml (в этом случае вы должен объявить пространство имен в вашем запрос), и элемент содержит ноль, вместо этого метод возвращает NULL. Так XQuery:

SELECT MyXml.exist('(/root/product[@id="304"])[1]' FROM MyTable

вернет True, если есть продукт со значением id "304" (продукт элемент с атрибутом id = "304"), или Ложь, если нет. Вы также можете использовать существует метод в предложении WHERE Оператор SQL:

SELECT column1, column2, column3 FROM MyTable
WHERE MyXml.exist('(/root/product[@id="304"])[1]') = 1
1 голос
/ 16 июля 2010

Пример использования метода value () :

DECLARE 
  @x xml, 
  @param int

SET @x = '<root><id>1</id><id>2</id><id>3</id></root>'
SET @param = 1

IF NOT EXISTS (
  SELECT * FROM @x.nodes('/root/id') n(x) WHERE x.value('.','int') = @param
) 
PRINT 'Insert'
ELSE 
PRINT 'Return'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...