SQL Server 2008 - нужны имена столбцов в качестве атрибута - PullRequest
0 голосов
/ 06 апреля 2011

Мне нужно создать запрос T-SQL в SQL Server 2008, который выводит данные в виде XML. Но это общий процесс, который запрашивает данные с разными столбцами, в именах которых могут быть пробелы. Поэтому я бы хотел, чтобы XML указывал имя столбца как атрибут (в именах элементов не допускаются пробелы).

Учитывая основную таблицу, которая ссылается на таблицу подробностей для дочерних записей, я бы хотел, чтобы вывод выглядел так:

<master id="123">
   <detail colname="customer">John Smith</detail>
   <detail colname="amount">888.45</detail>
   <detail colname="date">01/01/01</detail>
</master>
<master id="456">
   <detail colname="customer">Suzie Jones</detail>
   <detail colname="amount">1000.25</detail>
   <detail colname="date">05/05/01</detail>
</master>

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

Я полагаю, что это возможно при использовании команды PIVOT, но это становится ужасно, когда вы не знаете структуру данных. Я чувствую, что должен быть способ заставить имя столбца отображаться как значение атрибута!

спасибо за любой совет.

Ответы [ 5 ]

2 голосов
/ 29 декабря 2011

Используя XQuery, набор простых строк XML можно разворачивать в нужный формат

DECLARE @X xml = '<row id="123" customer="John Smith" amount="888.45" date="01/01/01" />'
                +'<row id="456" customer="Suzie Jones" amount="1000.25" date="05/05/01" />'

SELECT  @X.query
        (
            '
            for     $id in //row/attribute::id
            return  <master id="{ string($id) }">
                        {
                            for $attr in //row[@id=$id]/attribute::*
                            where local-name($attr) != "id"
                            return <detail columnname="{ local-name($attr) }">{ string($attr) }</detail>
                        }
                    </master>
            '
        )
1 голос
/ 29 декабря 2011

Еще одна опция, которая производит вывод следующим образом (обратите внимание на пробел в имени столбца):

<root>
  <master id="123">
    <detail
      customer_x0020_name="John Smith"
      amount="888.4500"
      date="2001-01-01"
    />
  </master>
  <master id="456">
    <detail
      customer_x0020_name="Suzie Jones"
      amount="1000.2500"
      date="2001-05-05"
    />
  </master>
</root>

Используя этот скрипт:

SELECT
    master.id,
(
    SELECT
        detail.[customer name],
        detail.amount,
        detail.[date]
    FROM dbo.detail AS detail
    WHERE
        detail.master_id = master.id
    FOR XML AUTO, TYPE
)
FROM dbo.master_table AS [master]
FOR XML AUTO, TYPE, ROOT('root')

... используя данные этого примера:

CREATE TABLE dbo.master_table
(
    id INTEGER PRIMARY KEY
)

CREATE TABLE dbo.detail 
(
    master_id       INTEGER NULL REFERENCES dbo.master_table,
    [customer name] VARCHAR(30) NULL, 
    amount          MONEY NULL,
    [date]          DATE NULL
)

INSERT dbo.master_table
    (id)
VALUES 
    (123), 
    (456)

INSERT dbo.detail
    (master_id, [customer name], amount, [date]) 
VALUES 
    (123, 'John Smith', $888.45, '2001-01-01'),
    (456, 'Suzie Jones', $1000.25, '2001-05-05')
0 голосов
/ 06 апреля 2011

Есть ли способ использовать «FOR XML» в своем запросе?Это делает большую тяжелую работу для вас.

На этой странице подробно описано нечто очень похожее на то, что вам нужно: http://msdn.microsoft.com/en-us/library/ms345137(v=sql.90).aspx

0 голосов
/ 06 апреля 2011

Вы можете создать хранимую процедуру, чтобы сделать это следующим образом:

if exists (select * from dbo.sysobjects where id = object_id(N'[QueryXML]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure QueryXML
GO
create procedure QueryXML
  @Columns VarChar(1000),
  @Table VarChar(100)
as
begin
  declare @query varchar(1100)

  set @query = 'select (select ' + @Columns + ' from ' + @Table + ' for XML PATH(''columns'')) for XML PATH(''''), ROOT (''SampleXML'')'   

  exec (@query)

end

Я пробовал с этими таблицами

create table dummy1(
  ID int not null identity(1,1),
  dummy1 int,
  dummy2 int,
  dummy3 int
)
GO

insert into dummy1 (dummy1,dummy2,dummy3) values(1,2,3)
insert into dummy1 (dummy1,dummy2,dummy3) values(4,5,6)
insert into dummy1 (dummy1,dummy2,dummy3) values(7,8,9)
insert into dummy1 (dummy1,dummy2,dummy3) values(10,11,12)
insert into dummy1 (dummy1,dummy2,dummy3) values(13,14,15)
insert into dummy1 (dummy1,dummy2,dummy3) values(16,17,18)

пример:

exec QueryXML @Columns = 'ID, dummy1', @Table = 'dummy1'
exec QueryXML @Columns = 'ID, dummy2,dummy3', @Table = 'dummy1'
exec QueryXML @Columns = 'ID, dummy1,dummy2,dummy3', @Table = 'dummy1'

Вы также можете просмотреть: sql-сервер-простой-пример-создания-XML-файла-использования-t-sql

0 голосов
/ 06 апреля 2011

Используйте предложение FOR XML в T-SQL

другие примеры здесь

Обновление

Для OP: используйте ДЛЯ EXPLICIT XML , чтобы явно установить значения атрибутов из столбцов.

Другое EXPLICIT примеры:

http://blogs.technet.com/b/wardpond/archive/2006/09/08/454938.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...