Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Ошибка при формировании XML UTF-8  [new]
ArkadyL
Member

Откуда: СПб
Сообщений: 156
Добрый день!

Требуется сформировать XML в кодировке UTF-8. При этом надо вставлять в файл поля, содержащие кириллические символы.
Покажите, пожалуйста на простом примерчике, как правильно преобразовывать данные, чтобы не получать ошибку типа "Недопустимый символ".

Если переменная @let содержит латинские символы - ошибки нет.

DECLARE @c TABLE (xx xml)
DECLARE @var varchar(MAX), @let varchar(1), @xml xml

  SET @let='ГГ'
  SET @var=N'<?xml version="1.0" encoding="UTF-8"?>'
  SET @var=@var+N'<RR>'+CONVERT(nvarchar, @let)+N'</RR>'
  
  SET @xml=CAST(@var AS XML) -- тут ошибка

  SELECT @var

  INSERT INTO @c (xx) VALUES  (@var) -- тут ошибка

  SELECT * FROM @c
22 мар 18, 17:21    [21278425]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
Konst_One
Member

Откуда:
Сообщений: 11518
ну не умеет он в UTF8, только UTF16
22 мар 18, 17:25    [21278438]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
ArkadyL, выкинуть SET @var=N'<?xml version="1.0" encoding="UTF-8"?>'
22 мар 18, 17:26    [21278443]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7762
ArkadyL
Требуется сформировать XML в кодировке UTF-8


Никак. Только внешними средствами конвертировать ANSI, UTF-16 в UTF-8. Можно SSIS использовать, но если нужен файл с BOM, то придется писать C# скрипт и повозиться с изучением самого SSIS.
22 мар 18, 18:39    [21278709]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
ArkadyL
Member

Откуда: СПб
Сообщений: 156
Но файл с такой кодировкой и кириллическими символами я могу принять и обработать.
Вообще-то мне достаточно сохранить его на диск, так что, видимо меня вполне устроит поле varchar(max).
23 мар 18, 09:57    [21279659]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5955
Владислав Колосов
но если нужен файл с BOM, то придется писать C# скрипт и повозиться с изучением самого SSIS.

Зачем SSIS, если C#? Там дел на 7 строчек кода, и без всякого участия SSIS.
23 мар 18, 11:54    [21280181]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
ArkadyL
Member

Откуда: СПб
Сообщений: 156
Скажите, пожалуйста, а если хранить этот UTF-8 XML, в поле varchar(max), кириллические символы в него надо писать обычным образом безо всякой предварительной обработки, чтобы потом принимающая сторона смогла прочитать его?
К нам приходят такие UTF-8 XML и SQL Server понимает в нём кириллицу как ни в чём не бывало.
26 мар 18, 12:12    [21285843]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
ArkadyL
Скажите, пожалуйста, а если хранить этот UTF-8 XML, в поле varchar(max), кириллические символы в него надо писать обычным образом безо всякой предварительной обработки, чтобы потом принимающая сторона смогла прочитать его?
К нам приходят такие UTF-8 XML и SQL Server понимает в нём кириллицу как ни в чём не бывало.

в SQL Server не приходит UTF-8 XML , потому что он его не знает. так что у вас в логике что-то не так.
26 мар 18, 13:20    [21286107]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
Владислав Колосов
Member

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

Вас обманывают, значит, кривым заголовком.
26 мар 18, 14:24    [21286359]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
ArkadyL
Member

Откуда: СПб
Сообщений: 156
Возможно, вы слышали о пресловутом постановлении 550-П ЦБ РФ. Они поставляют нам файлы в этой кодировке, а мы должны отправить ответ. Может, и кривой заголовок, но первая строка выглядит, как и в требуемом ответе.
4.3.1. Структура и формат уведомления о принятии (непринятии) ЭС.

<?xml version="1.0" encoding="UTF-8"?><!--допустимо любое значение регистра при
                                        указании кодировки "UTF-8"-->
<KVIT>
 <IDNOR></IDNOR>
 <ES></ES>
 <SIZE_ES></SIZE_ES>
 <DATE_ES></DATE_ES>
 <RECNO_ES nRec = "k"><!--количества операций, информация по которым
                        включается в ЭС-->
   <ES_REC IdInfoOR="<gggg>_<kkk>_<ii>_<mmmmmmmmmmmmmmmm>">
            <!--информация о принятии (непринятии) операции, идентификатор,
             которой указан в атрибуте IdInfoOR-->
     <REZ_ES></REZ_ES>
     <ERRORS_ES nRec="n"><!--количество ошибок-->
       <ERR_REC RecId="1"><!--1-й блок характеристики ошибок-->
        <KOD_ERR></KOD_ERR><!--код ошибки-->
        <NAM_ERR></NAM_ERR><!--описание ошибки-->
       </ERR_REC>
        ......................
       <ERR_REC RecId="n"><!--n-й блок характеристики ошибок-->
        <KOD_ERR></KOD_ERR><!--код ошибки-->
        <NAM_ERR></NAM_ERR><!--описание ошибки-->
       </ERR_REC>
      </ERRORS_ES>
   </ES_REC>
 .............................................
 <ES_REC IdInfoOR="<gggg>_<kkk>_<ii>_<mmmmmmmmmmmmmmmm>">
           <!--информация о принятии (непринятии) операции, идентификатор,
            которой указан в атрибуте IdInfoOR-->
   <REZ_ES></REZ_ES>
   <ERRORS_ES nRec="n"><!--количество ошибок-->
     <ERR_REC RecId="1"><!--1-й блок характеристики ошибок-->
      <KOD_ERR></KOD_ERR><!--код ошибки-->
      <NAM_ERR></NAM_ERR><!--описание ошибки-->
     </ERR_REC>
      ...
     <ERR_REC RecId="n"><!--n-й блок характеристики ошибок-->
      <KOD_ERR></KOD_ERR><!--код ошибки-->
      <NAM_ERR></NAM_ERR><!--описание ошибки-->
     </ERR_REC>
   </ERRORS_ES>
  </ES_REC>
 </RECNO_ES>
 <DATE_KVIT></DATE_KVIT>
 <TIME_KVIT></TIME_KVIT>
 <OPER></OPER>
 <TEL_OPER></TEL_OPER>
</KVIT>


Пока формируем и храним это как текстовый файл.
27 мар 18, 09:56    [21288685]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

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

это - то что вы должны посылать или то, что вам приходит?
27 мар 18, 10:04    [21288743]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
ArkadyL
Member

Откуда: СПб
Сообщений: 156
Это ответ.
4.3.1. Структура и формат уведомления о принятии (непринятии) ЭС.
27 мар 18, 10:23    [21288869]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
ArkadyL
Это ответ.
4.3.1. Структура и формат уведомления о принятии (непринятии) ЭС.

ответ может быть вам а может быть от вас ))
ладно - задам сразу второй вопрос
а как вы посылаете это ответ? )) Ведь сам ms sql не умеет "посылать файлы"
27 мар 18, 10:41    [21288983]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
blonduser
Member

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

Скорее всего SET @let='ГГ' - у вас в кодировки windows-1251
Если задать SET @var='<?xml version="1.0" encoding="windows-1251"?>' , то XML формируется.

Более подробно здесь:
https://docs.microsoft.com/ru-ru/sql/relational-databases/xml/create-instances-of-xml-data
27 мар 18, 11:13    [21289126]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
ArkadyL
Member

Откуда: СПб
Сообщений: 156
Гигабайт Мегабайтович Килобайтов
ArkadyL
Это ответ.
4.3.1. Структура и формат уведомления о принятии (непринятии) ЭС.

ответ может быть вам а может быть от вас ))
ладно - задам сразу второй вопрос
а как вы посылаете это ответ? )) Ведь сам ms sql не умеет "посылать файлы"


Формируем этот файл как текстовый и загружаем им на сайт. С их сайта и скачиваем.
Когда я из SQL Server просматриваю каталог, куда мы их списываем, и обрабатываю присланные нам файлы, всё происходит безошибочно. А первой строкой там находится UTF-8 и кириллица в файлах присутствует.
27 мар 18, 11:33    [21289213]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
ArkadyL
Гигабайт Мегабайтович Килобайтов
пропущено...

ответ может быть вам а может быть от вас ))
ладно - задам сразу второй вопрос
а как вы посылаете это ответ? )) Ведь сам ms sql не умеет "посылать файлы"


Формируем этот файл как текстовый и загружаем им на сайт. С их сайта и скачиваем.
Когда я из SQL Server просматриваю каталог, куда мы их списываем, и обрабатываю присланные нам файлы, всё происходит безошибочно. А первой строкой там находится UTF-8 и кириллица в файлах присутствует.

как вы можете "я из SQL Server просматриваю каталог, куда мы их списываем, и обрабатываю присланные нам файлы "?
у MS SQL нет возможности просматривать и обрабатывать файлы в каких-то каталогах или таки ms sql 2016 и выше?
27 мар 18, 11:41    [21289246]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Гигабайт Мегабайтович Килобайтов,

xp_cmdshell ?
27 мар 18, 11:43    [21289249]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
TaPaK
Гигабайт Мегабайтович Килобайтов,

xp_cmdshell ?

таки может обрабатывать файлы ? )) и да - таки и учетки есть права на просмотр любых каталогов? )))
вопрос в том что в принципе не "не может", а в том что автор знает и понимает как это делается у него в системе, а после уже можно будет выяснять как ему помочь ))
27 мар 18, 11:55    [21289305]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Гигабайт Мегабайтович Килобайтов
TaPaK
Гигабайт Мегабайтович Килобайтов,

xp_cmdshell ?

таки может обрабатывать файлы ? )) и да - таки и учетки есть права на просмотр любых каталогов? )))
вопрос в том что в принципе не "не может", а в том что автор знает и понимает как это делается у него в системе, а после уже можно будет выяснять как ему помочь ))

ваше невежество утомило
27 мар 18, 11:57    [21289321]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
TaPaK
Гигабайт Мегабайтович Килобайтов
пропущено...

таки может обрабатывать файлы ? )) и да - таки и учетки есть права на просмотр любых каталогов? )))
вопрос в том что в принципе не "не может", а в том что автор знает и понимает как это делается у него в системе, а после уже можно будет выяснять как ему помочь ))

ваше невежество утомило

таки утомляйтесь дальше , я не возражаю.
27 мар 18, 12:07    [21289373]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
ArkadyL
Member

Откуда: СПб
Сообщений: 156
Да, с помощью xp_cmdshell. SQL Server 2008.
Так, вроде, у меня всё работает. Ответные файлы формируем и храним у себя как varchar(max). Приложение затем сохраняет их на диск, и отправляем на сайт.
Но вот в присылаемых нам файлах всё-таки находится UTF-8.
И что-то типа
 
     SET @cSQL='SET @xmldoc=(SELECT * FROM OPENROWSET(BULK N'''+@ES550PFile+''', SINGLE_BLOB) AS Document)'
     EXEC sp_executesql @cSQL, N'@xmldoc varchar(MAX) out', @xmldoc = @xmldoc out

их прекрасно понимает и обрабатывает.
Для меня по незнанию это было неудивительно.
27 мар 18, 12:46    [21289539]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
ArkadyL
Да, с помощью xp_cmdshell. SQL Server 2008.
Так, вроде, у меня всё работает. Ответные файлы формируем и храним у себя как varchar(max). Приложение затем сохраняет их на диск, и отправляем на сайт.
Но вот в присылаемых нам файлах всё-таки находится UTF-8.
И что-то типа
 
     SET @cSQL='SET @xmldoc=(SELECT * FROM OPENROWSET(BULK N'''+@ES550PFile+''', SINGLE_BLOB) AS Document)'
     EXEC sp_executesql @cSQL, N'@xmldoc varchar(MAX) out', @xmldoc = @xmldoc out

их прекрасно понимает и обрабатывает.
Для меня по незнанию это было неудивительно.

а где вы тут видите xml? ))
27 мар 18, 13:25    [21289727]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
и да - как вы отправляете файлы?
27 мар 18, 13:26    [21289734]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
ArkadyL
Member

Откуда: СПб
Сообщений: 156
@ES550PFile - в этой переменной имя файла, и он XML, считывается из заданного каталога. А отправляет их собственными руками наш сотрудник из личного кабинета банка.
27 мар 18, 14:16    [21289964]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при формировании XML UTF-8  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
ArkadyL
@ES550PFile - в этой переменной имя файла, и он XML, считывается из заданного каталога. А отправляет их собственными руками наш сотрудник из личного кабинета банка.

в файле, в текстовом формате записаны данные, которые могут представлены в xml-формате ( а могут быть и не представлены) . xml - это не файл , это формат данных, а вот в чем он храниться - тут возможны варианты ))
у вас по факту - в каталоге хранятся файлы, по всей видимости в текстовом представление, в который записаны данные в xml-формате( как то коряво написал, но если не понятно спросите попробую по другому написать) .
так вот вы с помощью sp_executesql + OPENROWSET "читаете" эти файлы в
автор
текстовую
переменную
автор
N'@xmldoc varchar(MAX) out'
и в этом процессе нигде не присутствует работа с xml как с типом данных/
вот пример
1)
автор
declare @n varchar(max)='<a>a</a>

это работа с xml или нет? ))

и да почему такое странное применение OPENROWSET через sp_executesql ? почему нельзя сразу прочитать через OPENROWSET ?
27 мар 18, 14:38    [21290091]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить