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

Откуда:
Сообщений: 11
На MSSQL Server 2005 нужно сделать следующее: есть 2 переменная c типами xml и varchar(в ней хранится заголовок xml-документа). Нужно осуществить их конкатенацию и записать результат в текстовый файл. Я это делаю с помощью системных процедур Ole Automation (OA) следующим образом:

DECLARE @FileName varchar(255), @xml xml, @FS int, @OLEResult int, @FileID int, @text varchar(200)

select @FileName = 'имя_файла.xml.processed', @text = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>', @xml =
<RRC>
<rec dbrc="1">
<fKey>120</fKey>
<fName>Название</fName>
</rec>
</RRC>

EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUTPUT

execute @OLEResult = sp_OAMethod @FS,'CreateTextFile',@FileID OUTPUT, @FileName

execute @OLEResult = sp_OAMethod @FileID,'OpenAsTextStream(ForWriting, 2)'
execute @OLEResult = sp_OAMethod @FileID, 'Write', NULL, @text

execute @OLEResult = sp_OAMethod @FileID, 'Write', NULL, @xml

EXECUTE @OLEResult = sp_OADestroy @FileID

EXECUTE @OLEResult = sp_OADestroy @FS

То есть конкатенация происходит уже в файле, так как типы данных xml и varchar в операторе add несовместимы.
В результате получаю файл с кодировкой текста Кириллица (Windows). Мне же нужна кодировка utf-8
18 ноя 09, 10:21    [7943405]     Ответить | Цитировать Сообщить модератору
 Re: как записать данные в файл в нужной кодировке  [new]
osiris_Amon
Member

Откуда:
Сообщений: 11
да, файл я открываю в EmEditor. А вопрос собственно задан потому, что если в дальнейшем я захочу осуществить импорт файла обратно в SQL, и записываю текст в переменную типа xml с помощью команды openrowset, то при наличии в тексте русских символов выдает такую ошибку: "Синтаксический анализ XML: строка 1, символ 97, недопустимый символ"
18 ноя 09, 10:48    [7943577]     Ответить | Цитировать Сообщить модератору
 Re: как записать данные в файл в нужной кодировке  [new]
Glory
Member

Откуда:
Сообщений: 104760
А почему вы не задали свойство Encoding(вроде бы) файла, который создает ваш Ole Automation?
18 ноя 09, 10:56    [7943625]     Ответить | Цитировать Сообщить модератору
 Re: как записать данные в файл в нужной кодировке  [new]
osiris_Amon
Member

Откуда:
Сообщений: 11
у метода CreateTextFile есть 3 параметра: имя файла, overwrite(boolean) и unicode(boolean). Так вот последний принимает значения unicode (true) - по умолчанию и ASCII (false). Если не задавать значение (то есть unicode по умолчанию) то кодировка текста в файле будет Кириллица (Windows). Даже если явно проставить для этого параметра значение true, то файл записывается в кодировке utf-16, а не utf-8. Кстати почему разные кодировки при одинаковом параметре, заданном по умолчанию или указанном явно?
19 ноя 09, 07:13    [7948363]     Ответить | Цитировать Сообщить модератору
 Re: как записать данные в файл в нужной кодировке  [new]
Glory
Member

Откуда:
Сообщений: 104760
osiris_Amon
Даже если явно проставить для этого параметра значение true, то файл записывается в кодировке utf-16, а не utf-8. Кстати почему разные кодировки при одинаковом параметре, заданном по умолчанию или указанном явно?

По-моему, как раз по умолчанию encoding ANSI
19 ноя 09, 10:22    [7948877]     Ответить | Цитировать Сообщить модератору
 Re: как записать данные в файл в нужной кодировке  [new]
Glory
Member

Откуда:
Сообщений: 104760
osiris_Amon
Даже если явно проставить для этого параметра значение true, то файл записывается в кодировке utf-16, а не utf-8. Кстати почему разные кодировки при одинаковом параметре, заданном по умолчанию или указанном явно?

Хелп считает по-другому

unicode
Optional. Boolean value that indicates whether the file is created as a Unicode or ASCII file. The value is true if the file is created as a Unicode file, false if it's created as an ASCII file. If omitted, an ASCII file is assumed.
19 ноя 09, 10:24    [7948884]     Ответить | Цитировать Сообщить модератору
 Re: как записать данные в файл в нужной кодировке  [new]
osiris_Amon
Member

Откуда:
Сообщений: 11
Glory
Хелп считает по-другому
unicode
Optional. Boolean value that indicates whether the file is created as a Unicode or ASCII file. The value is true if the file is created as a Unicode file, false if it's created as an ASCII file. If omitted, an ASCII file is assumed.

согласен, я не так посмотрел. но при указании true мы все равно получаем текст в кодировке utf-16
19 ноя 09, 12:18    [7949856]     Ответить | Цитировать Сообщить модератору
 Re: как записать данные в файл в нужной кодировке  [new]
Glory
Member

Откуда:
Сообщений: 104760
osiris_Amon
Glory
Хелп считает по-другому
unicode
Optional. Boolean value that indicates whether the file is created as a Unicode or ASCII file. The value is true if the file is created as a Unicode file, false if it's created as an ASCII file. If omitted, an ASCII file is assumed.

согласен, я не так посмотрел. но при указании true мы все равно получаем текст в кодировке utf-16

Это и есть так кодировка с которой только и умеет работать MSSQL
Во все другие кодировки вам придется конвертировать данные самостоятельно
19 ноя 09, 12:25    [7949923]     Ответить | Цитировать Сообщить модератору
 Re: как записать данные в файл в нужной кодировке  [new]
osiris_Amon
Member

Откуда:
Сообщений: 11
Glory
osiris_Amon
согласен, я не так посмотрел. но при указании true мы все равно получаем текст в кодировке utf-16

Это и есть так кодировка с которой только и умеет работать MSSQL
Во все другие кодировки вам придется конвертировать данные самостоятельно

то есть в SQL Server 2005 даже с использованием fso и adodb.stream в процедурах ole automation я не смогу записать текст в файл с кодировкой utf-8?

а схема XML, в которой я пропишу ...encoding="UTF-8"... может решить проблему?
19 ноя 09, 13:50    [7950677]     Ответить | Цитировать Сообщить модератору
 Re: как записать данные в файл в нужной кодировке  [new]
Glory
Member

Откуда:
Сообщений: 104760
osiris_Amon
Glory
osiris_Amon
согласен, я не так посмотрел. но при указании true мы все равно получаем текст в кодировке utf-16

Это и есть так кодировка с которой только и умеет работать MSSQL
Во все другие кодировки вам придется конвертировать данные самостоятельно

то есть в SQL Server 2005 даже с использованием fso и adodb.stream в процедурах ole automation я не смогу записать текст в файл с кодировкой utf-8?

Сами вы туда записать можете что угодно. Но сервер за вас ничего конвертироваить не будет
19 ноя 09, 13:55    [7950710]     Ответить | Цитировать Сообщить модератору
 Re: как записать данные в файл в нужной кодировке  [new]
osiris_Amon
Member

Откуда:
Сообщений: 11
ответьте пожалуйста на такой вопрос:
есть таблица t(dbrc int identity, fKey int, fName varchar(50)). При выполнении запроса:
select dbrc as '@dbrc', fKey, fName from t for xml path('rec'), root('RRC')
я получаю такой XML (я его уже приводил выше):
<RRC>
<rec dbrc="1">
<fKey>120</fKey>
<fName>Название</fName>
</rec>
</RRC>

С помощью такой XSD схемы:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema id="Schema1" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="RRC" type="RRCType"/>
<xsd:complexType name="RRCType">
<xsd:sequence>
<xsd:element name="rec" type="recType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="recType">
<xsd:sequence>
<xsd:element name="fKey" type="xsd:integer"/>
<xsd:element name="fName" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="dbrc" type="xsd:integer" use="required"/>
</xsd:complexType>
</xsd:schema>'

я могу произвести валидацию этого XML.
Кроме того, я знаю, что можно создать аннотированную схему и привязать таблицу к шаблону. А можно ли (и какой командой или запросом) с помощью этого шаблона получить данные из таблицы сразу в формате xml, не составляя селект с применением языка xpath?
24 ноя 09, 15:38    [7971396]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить