2015-06-12 3 views
0

Давайте видеть этот запрос будетВключите column_id в atttribute в FOR XML PATH

SELECT * 
FROM Customer 
WHERE Id = 60 
FOR XML PATH ('Customer'), ELEMENTS XSINIL, TYPE 

возвращает XML как этот

<Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <Id>60</Id> 
     <BranchId>5</BranchId> 
     <DocKind>3</DocKind> 
     <Document>SomeDoc</Document> 
.... 

Как я могу добавить Column_id в Xml атрибуты каждого узла?

Это запрос, возвращая Column_Id «S таблицы Customer:

SELECT COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME), 
    COLUMN_NAME, 'ColumnID') AS COLUMN_ID, COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'Customer' 

Я хочу привести, как это:

<Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Id ColumnId=1>60</Id> 
    <BranchId ColumnId=2>5</BranchId> 
    <DocKind ColumnId=3>3</DocKind> 
    <Document ColumnId=4>SomeDoc</Document> 
+0

Я редактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

1

Вот решение:

DECLARE @s VARCHAR(MAX) = 
'select ' + STUFF((SELECT ',' + CAST(COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + 
          '.' + TABLE_NAME), COLUMN_NAME, 'ColumnID') AS VARCHAR(10)) + 
          ' as ''' + COLUMN_NAME + '/@ColumnID'', [' + COLUMN_NAME + ']' 
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE TABLE_NAME = 'Customer' 
        FOR XML PATH('')), 1, 1, '') + 
' from Customer FOR XML PATH(''Customer''),ELEMENTS XSINIL, TYPE' 
EXEC (@s) 
+0

Где значения «одной строки»? –

+0

@ArmenKhachatryan, не получил ваш вопрос .. –

+0

, пожалуйста, прочитайте снова, мне нужен результат, подобный этому 60 5 3 <Документ ColumnId = 4> SomeDoc значения являются одним значений строк в –

0

Если ваш в SQL Server, я думаю, что можно вам коррелированных подзапросов для каждого поля, такого как:

(select top(1) COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME), 
COLUMN_NAME, 'ColumnID') AS COLUMN_ID 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'Customer' AND COLUMN_NAME = 'BranchId') as 'BranchID/@Column_ID' 

Это быстрое приложение информации, указанной в TSQL FOR XML PATH Attribute On , Type.

С некоторыми образцами данных было бы легче увидеть, если он работает ...

CREATE TABLE Customer (ID INT IDENTITY(1,1), BranchID INT) 
GO 
INSERT INTO Customer SELECT ID FROM (VALUES (1),(2)) x(id) 
GO 

SELECT (SELECT TOP(1) COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME),COLUMN_NAME, 'ColumnID') 
      FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE TABLE_NAME = 'Customer' 
      AND COLUMN_NAME = 'ID') AS 'ID/@Column_ID' 
    ,ID 
    ,(SELECT TOP(1) COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME), COLUMN_NAME, 'ColumnID') 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE TABLE_NAME = 'Customer' AND COLUMN_NAME = 'BranchId') AS 'BranchID/@Column_ID' 
    ,BranchID 
FROM Customer 
WHERE Id = 1 FOR XML PATH ('Customer'), ELEMENTS XSINIL, TYPE 

И это заставляет меня:

<Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ID Column_ID="1">1</ID> 
    <BranchID Column_ID="2">1</BranchID> 
</Customer> 
+0

Спасибо за ответ, но результат teq quey, который вы написали, есть:

+0

Я хочу, чтобы какой-то универсальный метод, так что я не хочу, чтобы указать все të имена столбцов, может быть, они будут более –

+0

1. Что * точная * rdbms вы используете, включая версию? 2. Вы должны указать имена столбцов в вашем SQL, в общем. Однако, если вы можете построить такую ​​вещь в динамическом SQL, если вам нужен общий метод. –