Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sqlXmlBulkLoader и загрузка бинарных атрибутов / 18 сообщений из 18, страница 1 из 1
17.12.2020, 09:39
    #40028601
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
XML
Код: xml
1.
<Response ><Data><currentstamp stamp="0x000000001c098c92"/></Data></Response>



XSD
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  <xs:element name="Response"  sql:is-constant="1">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Data" minOccurs="0" maxOccurs="1" sql:is-constant="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="currentstamp" minOccurs="0" maxOccurs="unbounded"
                         sql:relation="Сurrentstamp" 
                         sql:key-fields="stamp"
              >
                <xs:complexType>

                  <xs:attribute name="stamp" type="xs:hexBinary" sql:datatype="varbinary(64)"/>

                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Dim objBL 
Set objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkload.4.0")
objBL.ConnectionString = "provider=SQLOLEDB;data source=.\XXXX;database=tempdb;integrated security=SSPI"
objBL.ErrorLogFile = "error.log"
objBL.CheckConstraints = 1
objBL.XMLFragment = 0
objBL.SchemaGen = 1
objBL.SGDropTables = 1
objBL.IgnoreDuplicateKeys = 0
objBL.ForceTableLock = 1
objBL.BulkLoad       = 1
objBL.KeepIdentity = 1
objBL.Execute "xsd\state.xsd", "xml\state.xml"


Отгребаю

Код: xml
1.
<?xml version="1.0"?><Error><Record><HResult>0x80004005</HResult><SQLState>22018</SQLState><NativeError>0</NativeError><Source>Microsoft OLE DB Provider for SQL Server</Source><Description><![CDATA[Недопустимое символьное значение для спецификации приведения.]]></Description></Record></Error>



Таблица успешно создается, НО вставить - не выходит.
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE [dbo].[Сurrentstamp](
	[stamp] [varbinary](64) NOT NULL,
 CONSTRAINT [Сurrentstamp_pk_1] PRIMARY KEY CLUSTERED 
(
	[stamp] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] 




Может есть знающие секрет этого фокуса?
...
Рейтинг: 0 / 0
17.12.2020, 10:22
    #40028619
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
Секрет в "0x"
Код: sql
1.
2.
3.
4.
select
 cast('' as xml).value('xs:hexBinary(sql:column("t.b"))', 'binary(1)')
from
 (values ('0x01'), ('01')) t(b)
...
Рейтинг: 0 / 0
17.12.2020, 10:31
    #40028624
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
invm
Секрет в "0x"
Код: sql
1.
2.
3.
4.
select
 cast('' as xml).value('xs:hexBinary(sql:column("t.b"))', 'binary(1)')
from
 (values ('0x01'), ('01')) t(b)



Спасибо, канешно. Это здорово.

Надо массированно грузить SQLXMLBulkLoad.
Т.е. править исходный XML не вариант.

Может есть еще знатоки 80 левела?
...
Рейтинг: 0 / 0
17.12.2020, 10:39
    #40028625
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
aleks222
Т.е. править исходный XML не вариант.
Тогда грузить строкой. Конвертировать потом.
...
Рейтинг: 0 / 0
17.12.2020, 10:49
    #40028630
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
invm
aleks222
Т.е. править исходный XML не вариант.
Тогда грузить строкой. Конвертировать потом.

Это я и делаю.
Хочется проще и быстрее.
...
Рейтинг: 0 / 0
17.12.2020, 17:00
    #40028827
FantomGood
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
Чтобы быстро загрузить xml он должен быть валидный.

Если Вы проверите исходный xml Вашей схемой то получите ошибку, потому что hexBinary это
hexBinary has a lexical representation where each binary octet is encoded as a character tuple, consisting of two hexadecimal digits ([0-9a-fA-F]) representing the octet code. For example, "0FB7" is a hex encoding for the 16-bit integer 4023 (whose binary representation is 111110110111). тут

Поэтому либо сделать корректным поле stamp или конвертировать данные после загрузки.
PS: в название таблицы "Сurrentstamp" первая буква русская.
...
Рейтинг: 0 / 0
17.12.2020, 17:51
    #40028862
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
FantomGood
Чтобы быстро загрузить xml он должен быть валидный.
Если Вы проверите исходный xml Вашей схемой то получите ошибку

Да, факт:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
use [data]
go
CREATE XML SCHEMA COLLECTION BinaryValueCollection
AS
N'<?xml version="1.0" encoding="UTF-16"?>
<xs:schema
  attributeFormDefault="unqualified"
  elementFormDefault="qualified"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Response">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Data">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="currentstamp">
                <xs:complexType>
                  <xs:attribute name="stamp" type="xs:hexBinary" use="required" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>';
GO
declare
  @x xml(BinaryValueCollection);
--Msg 6926, Level 16, State 1, Line 31
--XML Validation: Invalid simple type value: '0x000000001c098c92'. Location: /*:Response[1]/*:Data[1]/*:currentstamp[1]/@*:stamp
set @x=N'<Response><Data><currentstamp stamp="0x000000001c098c92" /></Data></Response>';
-- Ok
set @x=N'<Response><Data><currentstamp stamp="000000001c098c92" /></Data></Response>';
...
Рейтинг: 0 / 0
17.12.2020, 17:55
    #40028865
.Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
Извиняюсь, хочу немножко потроллить автора
Берется SSIS, в Script task забирается поток XML, парсится, трансформируется и пакетно записывается в БД. Массированно, быстро и несложно даже для "кнопкодава" типа меня.
...
Рейтинг: 0 / 0
17.12.2020, 19:19
    #40028892
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
.Евгений
Извиняюсь, хочу немножко потроллить автора
Берется SSIS, в Script task забирается поток XML, парсится, трансформируется и пакетно записывается в БД. Массированно, быстро и несложно даже для "кнопкодава" типа меня.

Не в рамках троллинга, информации получения для.
Предположим, у вас есть около 100 тысяч файлов, размером от 10 кБайт до 100 Мбайт, сложно-подчиненный xml из 10 таблиц, около 300 полей.
Сколько займет верификация и загрузка в набор реляционно-связанных таблиц с синтетическими ключами?
...
Рейтинг: 0 / 0
17.12.2020, 20:38
    #40028912
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
.Евгений
Извиняюсь, хочу немножко потроллить автора
Берется SSIS, в Script task забирается поток XML, парсится, трансформируется и пакетно записывается в БД. Массированно, быстро и несложно даже для "кнопкодава" типа меня.


Без SSIS и прочего геморроя.

Ну... не так оказывается в XML положено binary писать. Увы.
Хотя, XML не жалуется, а подло транслирует в null.
...
Рейтинг: 0 / 0
17.12.2020, 23:11
    #40028953
.Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
uaggster
.Евгений
Извиняюсь, хочу немножко потроллить автора
Берется SSIS, в Script task забирается поток XML, парсится, трансформируется и пакетно записывается в БД. Массированно, быстро и несложно даже для "кнопкодава" типа меня.

Не в рамках троллинга, информации получения для.
Предположим, у вас есть около 100 тысяч файлов, размером от 10 кБайт до 100 Мбайт, сложно-подчиненный xml из 10 таблиц, около 300 полей.
Сколько займет верификация и загрузка в набор реляционно-связанных таблиц с синтетическими ключами?

Более-менее точно не могу сказать, слишком большой разброс размера. Также сильно повлияет количество ядер (распараллеливание).
Поэтому скажу так: парсинг XML в реляционные данные выполнялся бы кодом C# (XMLReader? XMLDocument + XPathNavigator?) с соответствующей скоростью.

В моем случае обрабатывается поток XML объемом 10 кб из источника - шины со скоростью до 700 сообщений/сек. Парсить можно было бы и больше, но не успевает пакетная запись в БД (гарантированное сохранение принятых сообщений). Задержка обновления основного набора данных (разрешение ключей в суррогатные) на максимальных скоростях держится в пределах минуты от момента получения, норма - полминуты.
...
Рейтинг: 0 / 0
17.12.2020, 23:24
    #40028955
.Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
aleks222
Ну... не так оказывается в XML положено binary писать. Увы.
Хотя, XML не жалуется, а подло транслирует в null.
Настоящие индейцы забирают все значения в строковом виде и преобразуют их к нужному виду самостоятельно.
...
Рейтинг: 0 / 0
17.12.2020, 23:32
    #40028957
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
.Евгений
Также сильно повлияет количество ядер (распараллеливание).
Поэтому скажу так: парсинг XML в реляционные данные выполнялся бы кодом C# (XMLReader? XMLDocument + XPathNavigator?) с соответствующей скоростью.

В моем случае обрабатывается поток XML объемом 10 кб из источника - шины со скоростью до 700 сообщений/сек. Парсить можно было бы и больше, но не успевает пакетная запись в БД...
Это ещё не принимая во внимание Scale-Out на кластерах, на том-же Azure архитектурно вариантов решения таких задач достаточно,
начиная от Scala-Spark на DataBricks, DataLake (Gen1 с его U-SQL через кастомные C# Extractors)
или Gen2 напрямую при помощи ADF/DataFactory, даже тот-же современный MPP/Synapse (бывший APS/PDW) эти вопросы решает интегрировано.
Так что вопрос чисто местной политики по балансу требуемой цены/скорости{производительности} в пределах SLA как решать..
можно и тысячу Kитайцев/Индусов нанять в ручную переписывать...
Azure Service-Bus / Queue storage вполне справляется с такими нагрузками (на SQL вроде Service Broker назывался),
там на самом дешевом плане предел вроде 2 тыс сообщений в секунду на контейнере.. На Service Bus размер сообщения до 1Мб (против 64КБ на Queue)

У нас пиковые нагрузки побольше - поэтому потоковые букеты JSON/XML из разных источников пробуем мешать с Cosmos DB
...
Рейтинг: 0 / 0
18.12.2020, 05:24
    #40028984
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
.Евгений
В моем случае обрабатывается поток XML объемом 10 кб из источника - шины со скоростью до 700 сообщений/сек.

sqlXmlBulkLoad загружает раз в пять быстрее.
Одной строчкой кода и одной схемой.
...
Рейтинг: 0 / 0
18.12.2020, 06:02
    #40028986
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
aleks222
Ну... не так оказывается в XML положено binary писать. Увы.
Хотя, XML не жалуется, а подло транслирует в null.

Это by design так:
In XQuery, most dynamic errors are mapped to an empty sequence ("()"). However, these are the two exceptions: Overflow conditions in XQuery aggregator functions and XML-DML validation errors. Note that most dynamic errors are mapped to an empty sequence. Otherwise, query execution that takes advantages of the XML indexes may raise unexpected errors. Therefore, to provide an efficient execution without generating unexpected errors, SQL Server Database Engine maps dynamic errors to ().
https://docs.microsoft.com/en-us/sql/xquery/error-handling-xquery?view=sql-server-ver15

.Евгений
Поэтому скажу так: парсинг XML в реляционные данные выполнялся бы кодом C# (XMLReader? XMLDocument + XPathNavigator?) с соответствующей скоростью.

Только XmlReader (в виде инкапсулирующей оберки, которая имплементирует IDataReader). Остальные 2 варианта предполагают полную загрузку документа, и хранение в памяти его разобранной модели. Если XML будет с пяток гигов, то, сами понимаете.
...
Рейтинг: 0 / 0
18.12.2020, 08:59
    #40028996
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
Сон Веры Павловны
.ЕвгенийПоэтому скажу так: парсинг XML в реляционные данные выполнялся бы кодом C# (XMLReader? XMLDocument + XPathNavigator?) с соответствующей скоростью.

Только XmlReader (в виде инкапсулирующей оберки, которая имплементирует IDataReader). Остальные 2 варианта предполагают полную загрузку документа, и хранение в памяти его разобранной модели. Если XML будет с пяток гигов, то, сами понимаете.Ага, там квадратичная зависимость скорости импорта от объёма документа. Плюс линейная потребления памяти, а если документ не 1 гб, а 100?

XmlReader очень быстр, я его использовал, притом в режиме балка, имплементируя IDataReader, но код, конечно, получается немаленький.
...
Рейтинг: 0 / 0
18.12.2020, 09:42
    #40029002
.Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
aleks222
.Евгений
В моем случае обрабатывается поток XML объемом 10 кб из источника - шины со скоростью до 700 сообщений/сек.

sqlXmlBulkLoad загружает раз в пять быстрее.
Одной строчкой кода и одной схемой.

Я же объяснил, что скорость у меня ограничивается не парсингом, а совсем другим.
Поскольку объемы отдельных XML не измеряются гигабайтами, то прекрасно работает связка XMLDocument + XPathNavigator, которой подсовывается набор подготовленных аналитиком XPath, а я просто маплю их на поля таблиц - что гораздо проще, чем составление схемы или парсинг посредством SQL.
alexeyvg
XmlReader очень быстр, я его использовал, притом в режиме балка, имплементируя IDataReader, но код, конечно, получается немаленький.
Я как-то раз видел способ импорта asm-кода внутрь C#, думаю, что это было бы действительно быстро
...
Рейтинг: 0 / 0
18.12.2020, 12:23
    #40029031
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sqlXmlBulkLoader и загрузка бинарных атрибутов
К слову сказать, с xs:hexBinary не сталкивался, а base64Binary обрабатывается без проблем.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sqlXmlBulkLoader и загрузка бинарных атрибутов / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]