Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQL Server и XSD схемы  [new]
Tketano
Member

Откуда:
Сообщений: 98
Добрый день. Есть два вопроса по созданию и использованию схем XML на SQL Server.

Вопрос 1. Правильно ли я понимаю, что на 2005 сервере ссылаться на несистемные схемы нельзя? Т.е. так делать нельзя при создании схемы B:
IF EXISTS ( SELECT * FROM sys.xml_schema_collections WHERE name = N'A' )
    DROP xml schema collection [dbo].[A]
GO
 
CREATE XML SCHEMA COLLECTION [dbo].[A] AS
N'<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:aaa="http://a.com/a" targetNamespace="http://a.com/a">
    <xs:simpleType name="typeT">
        <xs:restriction base="xs:string"/>
    </xs:simpleType>
</xs:schema>'
GO
 
IF EXISTS ( SELECT * FROM sys.xml_schema_collections WHERE name = N'B' )
    DROP xml schema collection [dbo].[B]
GO
 
CREATE XML SCHEMA COLLECTION [dbo].[B] AS
N'<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:aaa="http://a.com/a">
    <xs:import namespace="http://a.com/a" schemaLocation="A.xsd"/>
    <xs:element name="ROOT" type="aaa:typeT"/>
</xs:schema>'
GO


Вопрос 2. Необходимо в схеме XML ограничить диапазон дат [гггг-мм-дд] для записи значения в поле smalldatetime (01.01.1900 - 06.06.2079). В описании типа я указываю минимальное и максимальное значение:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sql="http://schemas.microsoft.com/sqlserver/2004/sqltypes">
<xs:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/SqlTypes.xsd"/>
    <xs:simpleType name="sdate">
        <xs:restriction base="sql:date">
	    <xs:maxInclusive value="2079-06-06"/>
	    <xs:minInclusive value="1900-01-01"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>'
GO


И при создании такой схемы я всегда получаю тупое предупреждение:
Внимание! Тип "sdate" ограничен аспектом "pattern", что может препятствовать полному периоду обращения экземпляров этого типа.


Не понимаю, зачем сервер выдает это сообщение. Само собой любые свойства (facets) ограничивают данные. При этом схема создается полностью рабочей - валидность проверял. Я либо что-то не понимаю в описании схем для SQL Server, либо помогите отключить данное предупреждение! SQL SERVER 2005 =)
Спасибо!
3 июн 16, 11:33    [19253746]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server и XSD схемы  [new]
Tketano
Member

Откуда:
Сообщений: 98
Неужели никто с этим не сталкивался?
7 июн 16, 10:40    [19266004]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server и XSD схемы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
xs:date чем плох?
7 июн 16, 12:09    [19266464]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server и XSD схемы  [new]
Tketano
Member

Откуда:
Сообщений: 98
Владислав Колосов,

Ничем не плох, только разницы никакой. Как только вы укажите pattern без временных зон
"((000[1-9])|(00[1-9][0-9])|(0[1-9][0-9]{2})|([1-9][0-9]{3}))-((0[1-9])|(1[012]))-((0[1-9])|([12][0-9])|(3[01]))"
, то получите тоже самое сообщение об ошибке. Если pattern оставить пустым, то начнут проходить данные вроде 2016-06-07Z, 2016-06-07+03:00 и т.п.
При конвертации в smalldatetime/datetime часовой пояс конечно будет отсечен, но тут главное уже в самой схеме показать правильный формат данных (чтобы ожидания совпали с реальностью).
Та же петрушка с xs:dateTime без временных зон.
7 июн 16, 17:33    [19268181]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server и XSD схемы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
Tketano,

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

declare @x xml = '<t><dat>2016-12-31</dat></t>'
select c.t.value('./dat[1]', 'datetimeoffset') f1 from @x.nodes('/t') c(t)

declare @y xml = '<t><dat>2016-12-31 19:30:30Z</dat></t>'
select c.t.value('./dat[1]', 'datetimeoffset') f1 from @y.nodes('/t') c(t)

declare @z xml = '<t><dat>2016-12-31T19:30:30+03:00</dat></t>'
select c.t.value('./dat[1]', 'datetime') f1 from @z.nodes('/t') c(t)
7 июн 16, 17:54    [19268263]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server и XSD схемы  [new]
Tketano
Member

Откуда:
Сообщений: 98
Владислав Колосов,

Решение будет совместимо с SQL SERVER 2005, в базе данных только поля smalldatetime и datetime.
Таким образом временные зоны учитывать нет возможности не при каких обстоятельствах.

То о чем вы говорите - писать в документации формат полей типа [дата] с молчаливым откусыванием данных при чтении.
Мне хотелось бы пойти по пути полного контроля формата данных и я не понимаю, почему сервер так реагирует на схему с ограничениями в дате. В целом, конечно, ваш вариант рабочий.
7 июн 16, 18:15    [19268336]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить