2016-06-15 3 views
2

Я получаю данные из SQL строку, чтобы сделать файл XML, вот мой SQLУдаление XML-теги FOR XML PATH

SELECT [data] AS data 
FROM MyTable 
WHERE [Status] = '1' 
FOR XML PATH('DataLocation') 

А вот мой XML возврат

<DataLocation> 
    <data>String</data> 
</DataLocation> 

Проблема У меня есть, я хочу иметь теги DataLocation, но не тег data, я просто хочу показать значение String.

Куда я иду не так?

+0

Что вам нужно, если есть несколько совпадающих строк? – AakashM

+0

@AakashM Мне не нужен тег . Мне просто нужно значение «String». Все, что я хочу, это тег . – Nonagon

ответ

1

Имя столбца используется как тэг xml. К счастью, если у вас есть неопределенное или пустое (насколько я помню) имя столбца, не будет тега xml.

Так это должно работать:

SELECT [data] AS '' 
FROM MyTable 
WHERE [Status] = '1' 
FOR XML PATH('DataLocation') 

Если нет, то попробуйте следующее:

SELECT [data] 
FROM MyTable 
WHERE [Status] = '1' 
FOR XML PATH('DataLocation') 
+0

Это не работает, но он дал мне хорошую логику для поиска и лучшего понимания. Спасибо Редактировать: heres error - Имя столбца '' содержит недопустимый XML-идентификатор, как требуется FOR XML; – Nonagon

1

Ваш комментарий, что вы на самом деле хотите это единственное строковое значение в пределах DataLocation тега. Так что все, что вам нужно, это

SELECT data AS DataLocation 
FROM MyTable 
WHERE Status = '1' 
FOR XML PATH ('') 

Обратите внимание, что если в таблице есть несколько строк, соответствующих, вы получите несколько выхода DataLocation тегов; вы можете использовать дополнительный , ROOT('whatever'), чтобы окружить эти теги корневым элементом.

0

Возможно, вы ищете это?

DECLARE @MyTable TABLE(Data NVARCHAR(256), [Status] NVARCHAR(10)) 
INSERT INTO @MyTable(Data, [Status]) 
VALUES ('String', '1'), ('String1', '1'), ('String2', '1'), ('String3', '1'), ('String4', '2') 

SELECT STUFF((SELECT ' ' + Data FROM @MyTable WHERE [Status] = '1' FOR XML PATH('')), 1, 1, '') AS DataLocation FOR XML PATH('') 

Результат

<DataLocation>String String1 String2 String3</DataLocation> 
3

Есть несколько способов, которые приводят к тому же результату. Все они имеют там крошечные товары и антитовары:

DECLARE @tbl TABLE(Data NVARCHAR(100), [Status] INT) 
INSERT INTO @tbl(Data, [Status]) VALUES 
('test 1 with 1', 1) 
,('test 1 with 2', 2) 
,('test 2 with 1', 1); 

SELECT [data] AS [*] 
FROM @tbl 
WHERE [Status] = 1 
FOR XML PATH('DataLocation'); 

SELECT [data] AS [node()] 
FROM @tbl 
WHERE [Status] = 1 
FOR XML PATH('DataLocation'); 

SELECT '' + [data] --Any kind of computation results in "no caption name" 
FROM @tbl 
WHERE [Status] = 1 
FOR XML PATH('DataLocation') 

SELECT [data] AS DataLocation 
FROM @tbl 
WHERE [Status] = 1 
FOR XML PATH('') 

Маленький фон: Если имя столбца будет использоваться. Поэтому вам нужно найти способ избавиться от имени этого столбца или заменить его тем, который вам нужен.