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

Откуда: г. Белгород
Сообщений: 2171
Есть вспомогательная база на FireBird 2.0 Есть наша рабочая база на MS SQL 2005. В MS SQL есть линкед ссылающейся на эту бузу, сделан при помощи ODBC драйвера Firebird_ODBC_2.0.0.148_win32.

Во вспомогательной базе(FireBird) есть таблица, одно из полей которой имеет тип VARCHAR(32000).
Значение поля - это .zip файл представленый в шеснадцатиричном виде.

Делаю такой запрос
select 
	CODE_CLIENT,
	DATE_DOC,
	DIRECTION,
	INFO as binary
from 
	RS_TEST...MESSAGES
where 
	DIRECTION = 0
Ошибка:
Поставщик OLE DB "MSDASQL" для связанного сервера "RS_TEST" вернул сообщение "Требуемое преобразование не поддерживается.".
Сообщение 7341, уровень 16, состояние 2, строка 1
Не удалось получить значение текущей строки столбца "[RS_TEST]...[MESSAGES].INFO" от поставщика OLE DB "MSDASQL" для связанного сервера "RS_TEST". 


Делаю так
select 
	CODE_CLIENT,
	DATE_DOC,
	DIRECTION,
	CAST(INFO as binary)
from 
	RS_TEST...MESSAGES
where 
	DIRECTION = 0
Ошибка:
Сообщение 529, уровень 16, состояние 2, строка 1
"Явное преобразование типа данных text в binary не разрешено."



Отсюда два вопроса:
1. Как вытащить это поле из базы FireBird
2. Как это поле выгрузить в виде .zip файла на диск.
29 июл 09, 11:52    [7472876]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
The Dim!
Member

Откуда: г. Белгород
Сообщений: 2171
Извеняюсь, первый запрос имеет вид
select 
	CODE_CLIENT,
	DATE_DOC,
	DIRECTION,
	INFO
from 
	RS_TEST...MESSAGES
where 
	DIRECTION = 0
Ошибка:
Поставщик OLE DB "MSDASQL" для связанного сервера "RS_TEST" вернул сообщение "Требуемое преобразование не поддерживается.".
Сообщение 7341, уровень 16, состояние 2, строка 1
Не удалось получить значение текущей строки столбца "[RS_TEST]...[MESSAGES].INFO" от поставщика OLE DB "MSDASQL" для связанного сервера "RS_TEST". 
29 июл 09, 11:54    [7472890]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
Glory
Member

Откуда:
Сообщений: 104760
select * from opqnquery(RS_TEST, 'select 
	CODE_CLIENT,
	DATE_DOC,
	DIRECTION,
	INFO
from 	MESSAGES
where DIRECTION = 0') as a
29 июл 09, 11:56    [7472915]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
The Dim!
Member

Откуда: г. Белгород
Сообщений: 2171
Glory
select * from opqnquery(RS_TEST, 'select 
	CODE_CLIENT,
	DATE_DOC,
	DIRECTION,
	INFO
from 	MESSAGES
where DIRECTION = 0') as a


Так тоже не получается
Поставщик OLE DB "MSDASQL" для связанного сервера "RS_TEST" вернул сообщение "Требуемое преобразование не поддерживается.".
Сообщение 7341, уровень 16, состояние 2, строка 1
Не удалось получить значение текущей строки столбца "[MSDASQL].INFO" от поставщика OLE DB "MSDASQL" для связанного сервера "RS_TEST". 
29 июл 09, 11:59    [7472933]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
Glory
Member

Откуда:
Сообщений: 104760
The Dim!
Glory
select * from opqnquery(RS_TEST, 'select 
	CODE_CLIENT,
	DATE_DOC,
	DIRECTION,
	INFO
from 	MESSAGES
where DIRECTION = 0') as a


Так тоже не получается
Поставщик OLE DB "MSDASQL" для связанного сервера "RS_TEST" вернул сообщение "Требуемое преобразование не поддерживается.".
Сообщение 7341, уровень 16, состояние 2, строка 1
Не удалось получить значение текущей строки столбца "[MSDASQL].INFO" от поставщика OLE DB "MSDASQL" для связанного сервера "RS_TEST". 


Значит

select * from opqnquery(RS_TEST, 'select 
	CODE_CLIENT,
	DATE_DOC,
	DIRECTION,
	<тут нужно преобразовать INFO в тип, который поддерживает MSSQL>
from 	MESSAGES
where DIRECTION = 0') as a
29 июл 09, 12:02    [7472958]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
The Dim!
Member

Откуда: г. Белгород
Сообщений: 2171
В том то и дело, что незнаю в какой.
Пробывал так

cast(INFO as varchar(max))
cast(INFO as text)
во всех случаях получаю - "Требуемое преобразование не поддерживается."


и так
cast(INFO as binary)
получаю - "Явное преобразование типа данных text в binary не разрешено."
29 июл 09, 12:18    [7473082]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
Glory
Member

Откуда:
Сообщений: 104760
The Dim!
В том то и дело, что незнаю в какой.
Пробывал так

cast(INFO as varchar(max))
cast(INFO as text)
во всех случаях получаю - "Требуемое преобразование не поддерживается."


и так
cast(INFO as binary)
получаю - "Явное преобразование типа данных text в binary не разрешено."

Это вы все внутри openquery пишите ?
29 июл 09, 12:24    [7473127]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
The Dim!
Member

Откуда: г. Белгород
Сообщений: 2171
Glory
The Dim!
В том то и дело, что незнаю в какой.
Пробывал так

cast(INFO as varchar(max))
cast(INFO as text)
во всех случаях получаю - "Требуемое преобразование не поддерживается."


и так
cast(INFO as binary)
получаю - "Явное преобразование типа данных text в binary не разрешено."

Это вы все внутри openquery пишите ?


Так... запрос из OpenQuery выполняется не на MS SQL а на FireBird. А там нету такой функции CAST.
29 июл 09, 12:27    [7473152]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
The Dim!
Member

Откуда: г. Белгород
Сообщений: 2171
Попробывал так
select * from OpenQuery(RS_TEST, 'select 
	CODE_CLIENT,
	DATE_DOC,
	DIRECTION,
	cast(INFO as varchar(max)) 
from 	
	MESSAGES
where 
	DIRECTION = 0') as a

Получил ошибку
Поставщик OLE DB "MSDASQL" для связанного сервера "RS_TEST" вернул сообщение "[ODBC Firebird Driver][Firebird]Dynamic SQL Error
SQL error code = -104
Token unknown - line 5, char 23
max".
Сообщение 7321, уровень 16, состояние 2, строка 1
Ошибка при подготовке запроса "select 
	CODE_CLIENT,
	DATE_DOC,
	DIRECTION,
	cast(INFO as varchar(max)) 
from 	
	MESSAGES
where 
	DIRECTION = 0" к выполнению при помощи поставщика OLE DB "MSDASQL" для связанного сервера "RS_TEST". 
29 июл 09, 12:28    [7473156]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
Glory
Member

Откуда:
Сообщений: 104760
The Dim!
Glory
The Dim!
В том то и дело, что незнаю в какой.
Пробывал так

cast(INFO as varchar(max))
cast(INFO as text)
во всех случаях получаю - "Требуемое преобразование не поддерживается."


и так
cast(INFO as binary)
получаю - "Явное преобразование типа данных text в binary не разрешено."

Это вы все внутри openquery пишите ?


Так... запрос из OpenQuery выполняется не на MS SQL а на FireBird. А там нету такой функции CAST.

Ну так и силами FireBird и надо преобразовать данные к тому типу, который принимает драйвер MS SQL.
Потому что ваш Поставщик OLE DB "MSDASQL" вернул сообщение "Требуемое преобразование не поддерживается.". А не функция CAST вернула ошибку. Понимаете разницу ?
29 июл 09, 12:30    [7473167]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
The Dim!
Member

Откуда: г. Белгород
Сообщений: 2171
Как я понимаю, дело вот в чём...

В BOL сказано.
"Данные char или varchar могут быть отдельным знаком или строкой максимальной длиной в 8000 символов для данных char и до 2^31 символов для данных varchar."

При выборке полей типа varchar длинна которых не превышает 8000 из базы FireBird проблем не возникает. А при выборке полей длинней 8000. появляется сообщение "Явное преобразование типа данных text в binary не разрешено."

То есть, если я делаю так
select 
*
from
OpenQuery(RS_TEST, 'select 
							CODE_CLIENT,
							DATE_DOC,
							DIRECTION,
							cast(INFO as VARCHAR(8000)) as info
						from 	
							MESSAGES
						where 
							DIRECTION = 0'
	) as a
всё отрабатывает нормально.
А если
select
*
from
OpenQuery(RS_TEST, 'select 
							CODE_CLIENT,
							DATE_DOC,
							DIRECTION,
							cast(INFO as VARCHAR(32000)) as info
						from 	
							MESSAGES
						where 
							DIRECTION = 0'
	) as a
То тут снова появляется: "Требуемое преобразование не поддерживается."

В BOL сказано.
"В Microsoft SQL Server 2005 имеется признак max. Этот признак расширяет возможности хранения типов данных varchar, nvarchar и varbinary. varchar(max), nvarchar(max) и varbinary(max) вместе называются типами данных больших значений. Можно использовать типы данных больших значений для хранения 2^31-1 байт данных.

Если параметр хранимой процедуры sp_tableoption "типы большого объема выходят за пределы строки" установлен в положение OFF, внутристроковый предел размера типов больших значений составит 8 000 байт. 16-ти байтовое основание хранится внутри строки, если этот параметр в положении ON. Дополнительные сведения см. в разделе sp_tableoption (Transact-SQL)."

Пробовал создавать временную таблицу, но но при указании этой таблицы в sp_tableoption получаю сообщение:
"Пользовательская таблица, совпадающая с входным именем "#tmpMsgTab", отсутствует в текущей базе данных, или отсутствует разрешение на доступ к таблице."

А как включить поддержку типов данных больших значений не для таблицы в базе, а для такой вот выбоки из OpenQuery ?

Сообщение было отредактировано: 29 июл 09, 13:52
29 июл 09, 13:44    [7473733]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
Glory
Member

Откуда:
Сообщений: 104760
А теперь процитируйте хелп того драйвера, с помощью которого вы осуществляете доступ к FireBird 2.0, на предмет того, что он умеет правильно конвертировать VARCHAR(32000) FireBird-а в какой-нибудь тип MSSQL
29 июл 09, 13:48    [7473758]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
The Dim!
cast(INFO as VARCHAR(32000)) as info
- Это вы где нашли тип данных VARCHAR(32000)?
Вот и пишите VARCHAR(max), если у дазы уровень соместимости, конечно, 90.

Сообщение было отредактировано: 29 июл 09, 13:52
29 июл 09, 13:51    [7473777]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
The Dim!
Member

Откуда: г. Белгород
Сообщений: 2171
tpg
The Dim!
cast(INFO as VARCHAR(32000)) as info
- Это вы где нашли тип данных VARCHAR(32000)?
Вот и пишите VARCHAR(max), если у дазы уровень соместимости, конечно, 90.


Это исполняется не на MSSQL Server а на FireBird. Это преобразование можно опустить, выборка из FireBird идет и без преобразования.

Дело в том, как я понимаю, что у меня в MS SQL не включена поддержка типов данных больших значений.
Я исхожу из того, что при cast(INFO as VARCHAR(8000)) я могу выбрать этот столбец, а при cast(INFO as VARCHAR(32000)) уже нет.
8000 это ограничение на длину char/varchar - без включения этой типов данных больших значений.
29 июл 09, 14:04    [7473896]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
Glory
Member

Откуда:
Сообщений: 104760
The Dim!
tpg
The Dim!
cast(INFO as VARCHAR(32000)) as info
- Это вы где нашли тип данных VARCHAR(32000)?
Вот и пишите VARCHAR(max), если у дазы уровень соместимости, конечно, 90.


Это исполняется не на MSSQL Server а на FireBird. Это преобразование можно опустить, выборка из FireBird идет и без преобразования.

Дело в том, как я понимаю, что у меня в MS SQL не включена поддержка типов данных больших значений.
Я исхожу из того, что при cast(INFO as VARCHAR(8000)) я могу выбрать этот столбец, а при cast(INFO as VARCHAR(32000)) уже нет.
8000 это ограничение на длину char/varchar - без включения этой типов данных больших значений.

Пока вы не поймете, что между MSSQL и Firebird есть еще драйвер, у вас ничего не получится.
И то, что вы процитировали про sp_tableoption, не имеет никакого отношения к "включению поддержки типов данных больших значений". Эта поддержка автоматически "включается" при декларации переменной или поля в MSSQL
29 июл 09, 14:09    [7473939]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
The Dim!
Member

Откуда: г. Белгород
Сообщений: 2171
Согласен. По всей видимости, ODBC драйвер не поддерживает varchar длинной более 8000.
С этим моментом всё понятно.

Тогда вторая часть вопроса. Как преобразовать строку шестнадцатеричных чисел в бинарную последовательность ?
29 июл 09, 14:21    [7474035]     Ответить | Цитировать Сообщить модератору
 Re: Помогите выбрать файл из текстового поля.  [new]
vino
Member

Откуда:
Сообщений: 1191
The Dim!
...Как преобразовать строку шестнадцатеричных чисел в бинарную последовательность ?
поиск в помощь
29 июл 09, 14:32    [7474119]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить