Показать XML Схема в SQL Результат запроса - PullRequest
0 голосов
/ 18 февраля 2020

Я новичок в SQL и SQL Server Management Studio, так что терпите меня. Вот сокращенная версия моего запроса:

SELECT *
FROM [dbo].[BranchLocations] WHERE NOT (PropertyOwnerType IS NULL)
FOR XML PATH('LocationData'), ROOT('MainRoot')

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

My Схема выглядит примерно так:

<xs:schema id="LocationData_ds" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="LocationData_ds" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
        <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="LocationData">
            <xs:complexType>
                <xs:sequence>
                <xs:element name="EntityID" type="xs:string" />
                <xs:element name="AddressLine" type="xs:string" minOccurs="0" />
                <xs:element name="Locality" type="xs:string" minOccurs="0" />
                <xs:element name="AdminDistrict" type="xs:string" minOccurs="0" />
                <xs:element name="PostalCode" type="xs:string" minOccurs="0" />
                <xs:element name="CountryRegion" type="xs:string" minOccurs="0" />
                <xs:element name="Latitude" type="xs:double" minOccurs="0" />
                <xs:element name="Longitude" type="xs:double" minOccurs="0" />
                </xs:sequence>
            </xs:complexType>
            </xs:element>
        </xs:choice>
        </xs:complexType>
        <xs:unique name="Constraint1" msdata:PrimaryKey="true">
        <xs:selector xpath=".//LocationData" />
        <xs:field xpath="EntityID" />
        </xs:unique>
    </xs:element>
</xs:schema>

Мой запрос возвращает это:

<MainRoot>
  <LocationData>
    <EntityID>10010000</EntityID>
    <AddressLine>1234 address<\/AddressLine>
    <Locality>Converse</Locality>
    <AdminDistrict>TX</AdminDistrict>
    <PostalCode>12345</PostalCode>
    <CountryRegion>US</CountryRegion>
  </LocationData>
  <LocationData>
    <EntityID>70390000</EntityID>
    <AddressLine>1234 address<\/AddressLine>
    <Locality>Denver</Locality>
    <AdminDistrict>CO</AdminDistrict>
    <PostalCode>12345</PostalCode>
    <CountryRegion>US</CountryRegion>
  </LocationData>
...
<MainRoot>

И то, что мне нужно , таково:
(и Мне нужно также включить <?xml version="1.0" encoding="utf-8" standalone="yes"?> наверху)

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<MainRoot>
    <xs:schema id="LocationData_ds" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
        <xs:element name="LocationData_ds" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
            <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="LocationData">
                <xs:complexType>
                    <xs:sequence>
                    <xs:element name="EntityID" type="xs:string" />
                    <xs:element name="AddressLine" type="xs:string" minOccurs="0" />
                    <xs:element name="Locality" type="xs:string" minOccurs="0" />
                    <xs:element name="AdminDistrict" type="xs:string" minOccurs="0" />
                    <xs:element name="PostalCode" type="xs:string" minOccurs="0" />
                    <xs:element name="CountryRegion" type="xs:string" minOccurs="0" />
                    <xs:element name="Latitude" type="xs:double" minOccurs="0" />
                    <xs:element name="Longitude" type="xs:double" minOccurs="0" />
                    </xs:sequence>
                </xs:complexType>
                </xs:element>
            </xs:choice>
            </xs:complexType>
            <xs:unique name="Constraint1" msdata:PrimaryKey="true">
            <xs:selector xpath=".//LocationData" />
            <xs:field xpath="EntityID" />
            </xs:unique>
        </xs:element>
    </xs:schema>
<LocationData>
    <EntityID>10010000</EntityID>
    <AddressLine>1234 address<\/AddressLine>
    <Locality>Converse</Locality>
    <AdminDistrict>TX</AdminDistrict>
    <PostalCode>12345</PostalCode>
    <CountryRegion>US</CountryRegion>
  </LocationData>
  <LocationData>
    <EntityID>70390000</EntityID>
    <AddressLine>1234 address<\/AddressLine>
    <Locality>Denver</Locality>
    <AdminDistrict>CO</AdminDistrict>
    <PostalCode>12345</PostalCode>
    <CountryRegion>US</CountryRegion>
  </LocationData>
...
<MainRoot>

Просмотр документации привел меня сюда:
https://docs.microsoft.com/en-us/sql/t-sql/xml/insert-xml-dml?view=sql-server-ver15
Это не так работает, но я думаю, что я на правильном пути.

Эти ответы относятся только к генерации схемы:
преобразование таблицы базы данных в XML файл схемы
как создать XML схему из существующей базы данных в SQL Server 2008

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020
declare @BranchLocations table
(
EntityId varchar(20),
AddressLine varchar(20),
Locality varchar(20),
AdminDistrict varchar(20),
PostalCode varchar(20),
CountryRegion varchar(20),
PropertyOwnerType varchar(20)
); 


insert into @BranchLocations(EntityId, AddressLine, Locality, AdminDistrict, PostalCode, CountryRegion, PropertyOwnerType)
values
('10010000', '1234 address', 'Converse', 'TX', '12345', 'US', 'x'),
('70390000', '1234 address', 'Denver', 'CO', '12345', 'US', 'x');


declare @myschema xml = N'<xs:schema id="LocationData_ds" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="LocationData_ds" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
        <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="LocationData">
            <xs:complexType>
                <xs:sequence>
                <xs:element name="EntityID" type="xs:string" />
                <xs:element name="AddressLine" type="xs:string" minOccurs="0" />
                <xs:element name="Locality" type="xs:string" minOccurs="0" />
                <xs:element name="AdminDistrict" type="xs:string" minOccurs="0" />
                <xs:element name="PostalCode" type="xs:string" minOccurs="0" />
                <xs:element name="CountryRegion" type="xs:string" minOccurs="0" />
                <xs:element name="Latitude" type="xs:double" minOccurs="0" />
                <xs:element name="Longitude" type="xs:double" minOccurs="0" />
                </xs:sequence>
            </xs:complexType>
            </xs:element>
        </xs:choice>
        </xs:complexType>
        <xs:unique name="Constraint1" msdata:PrimaryKey="true">
        <xs:selector xpath=".//LocationData" />
        <xs:field xpath="EntityID" />
        </xs:unique>
    </xs:element>
</xs:schema>';

declare @res nvarchar(max);
select @res = N'<?xml version="1.0" encoding="utf-8" standalone="yes"?>' + 
(
select *
from
(
    select @myschema as '*'
    union all
    select
    (
    select *
    FROM @BranchLocations 
    WHERE PropertyOwnerType is not null
    FOR XML PATH('LocationData')
    )
) as src
for xml path(''), root('Mainroot')
);


--test, show result
select 1 as tag, 0 as parent, 
        @res+'</foo>' as 'test!1!!xmltext'
for xml explicit;


--or
select @res = null;
declare @myxml xml = (  select *
    FROM @BranchLocations 
    WHERE PropertyOwnerType is not null
    and 1=2
    FOR XML PATH('LocationData'));

--null result when empty resultset from table   
select @res = 
N'<?xml version="1.0" encoding="utf-8" standalone="yes"?>'
+(select @myschema,@myxml for xml path(''), root('Mainroot'))
where @myxml is not null;

select @res;
0 голосов
/ 18 февраля 2020

То, что вы ищете, называется Inline XSD Schema . Вот ссылка BOL: Создание встроенной схемы XSD

К сожалению, она очень ограничена: "... Вы можете указать XMLSCHEMA только в режимах RAW и AUTO, но не в EXPLICIT режим ... ". То же самое с режимом PATH .

Дополнительным ограничением является то, что SQL Сервер сохраняет XML как UTF-16 и извлекает пролог XML из любого типа данных XML внутри. .

Чтобы достичь того, что вам нужно, все нужно сделать вручную, то есть соединить пролог, XML схему и фактическую XML.

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