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

Откуда: Perm
Сообщений: 22
День добрый, необходимо выгрузить текстовый файл из sql-server в кодировке utf-8, bcp данную кодировку не поддерживает, нашел такую процедуру на форуме
https://www.sql.ru/forum/actualthread.aspx?tid=807172&pg=1&mid=9803638#9803638

CREATE PROCEDURE [dbo].[spSaveToFile] (
	 @@File		SysName
	,@@Data		NVarChar(max)
	,@@Encoding	SysName	= 'utf-8'
) WITH EXECUTE AS OWNER AS BEGIN
	DECLARE	 @OLEStream	Int
		,@Code		Int
		,@Method	SysName
		,@Source	SysName
		,@Descript	NVarChar(4000)
	EXEC @Code = sys.sp_OACreate 'ADODB.Stream' ,@OLEStream OUT
	IF (@Code != 0)
		SELECT	 @Method	= 'Scripting.Stream'
			,@Source	= 'sp_OACreate'
			,@Descript	= 'Ошибка создания OLE объекта'
	ELSE BEGIN
		SET @Method = 'Open';		EXEC @Code = sys.sp_OAMethod		@OLEStream ,@Method			IF (@Code != 0) GOTO Error;
		SET @Method = 'CharSet';	EXEC @Code = sys.sp_OASetProperty	@OLEStream ,@Method, @@Encoding		IF (@Code != 0) GOTO Error;
		SET @Method = 'WriteText';	EXEC @Code = sys.sp_OAMethod		@OLEStream ,@Method ,NULL ,@@Data	IF (@Code != 0) GOTO Error;
		SET @Method = 'SaveToFile';	EXEC @Code = sys.sp_OAMethod		@OLEStream, @Method, NULL, @@File, 2	IF (@Code != 0) GOTO Error;
		SET @Method = 'Close';		EXEC @Code = sys.sp_OAMethod		@OLEStream, @Method			IF (@Code != 0) GOTO Error;
		SET @Method = NULL; GOTO Destroy;
Error:						EXEC @Code = sys.sp_OAGetErrorInfo	@OLEStream ,@Source OUT ,@Descript OUT
Destroy:					EXEC @Code = sys.sp_OADestroy		@OLEStream
	END
	-- Вывод ошибок
	IF (@Method IS NOT NULL) BEGIN
		RAISERROR('Ошибка при выполнении метода "%s" в "%s": %s',18,1,@Method,@Source,@Descript)
		RETURN	@@Error
	END
END
GO

,но не могу понять как результат запроса сохранить с ее помощью, а именно как результат запроса представить в виде переменной nvarchar(max)
27 июл 12, 12:56    [12924848]     Ответить | Цитировать Сообщить модератору
 Re: результат запроса в текстовый файл в кодировке utf-8  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Никак Вы не получите набор данных в переменную. Выгружайте bcp и конвертируйте каким-нибудь внешним конвертором.
27 июл 12, 13:24    [12925066]     Ответить | Цитировать Сообщить модератору
 Re: результат запроса в текстовый файл в кодировке utf-8  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3104
а если отказаться от bcp и использовать sqlcmd ?
27 июл 12, 13:43    [12925233]     Ответить | Цитировать Сообщить модератору
 Re: результат запроса в текстовый файл в кодировке utf-8  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
pkarklin
Никак Вы не получите набор данных в переменную. Выгружайте bcp и конвертируйте каким-нибудь внешним конвертором.

Можно, вприсядку с бубном
DECLARE @text varchar(max)

SET @text = 'Id;Title'
;WITH T
AS
(
 SELECT 1 as Id ,'1111' Title 
 UNION ALL
 SELECT 2 as Id ,'222' Title 
 
)

SELECT @text = ISNULL(@text+CHAR(13)+CHAR(10),'')+ CAST(Id as varchar(16) ) +';'+Title
FROM T

PRINT @text


лучше конечно в хмл типизированный и стронним сервисом.
Все эти cmdshell, sp_OA CLR только для "собственного" сервера и то сомнительны, у хостера они запрещены.
27 июл 12, 13:52    [12925298]     Ответить | Цитировать Сообщить модератору
 Re: результат запроса в текстовый файл в кодировке utf-8  [new]
qwerty112
Guest
Vinni059
как результат запроса представить в виде переменной nvarchar(max)

можно так же, через OLE и ADODB.Recordset
	DECLARE	 @AdoRecordset	Int
			,@Code			Int
			,@Result		NVarChar(4000)

	exec @Code = sp_OACreate 'ADODB.Recordset' ,@AdoRecordset OUT
	exec @Code = sp_OAMethod @AdoRecordset, 'Open', NULL, 'select top 10 * from dbo.spt_values', 'Provider=SQLOLEDB.1;Data Source=(local);Integrated Security=SSPI;Initial Catalog=master'
	exec @Code = sp_OAMethod @AdoRecordset, 'GetString', @Result OUT

print @Result

	exec @Code = sp_OADestroy @AdoRecordset	
27 июл 12, 13:55    [12925326]     Ответить | Цитировать Сообщить модератору
 Re: результат запроса в текстовый файл в кодировке utf-8  [new]
qwerty112
Guest
с "вариантами"
declare @ColumnDelimiter	varchar(1),
		@RowDelimiter		varchar(2) 
set @ColumnDelimiter = ';'
set @RowDelimiter = char(13)+char(10)

exec @Code = sp_OAMethod @AdoRecordset, 'GetString', @Result OUT, 2, -1, @ColumnDelimiter, @RowDelimiter

print @Result

rpc;1;A  ;;;0
pub;2;A  ;;;0
sub;4;A  ;;;0
dist;8;A  ;;;0
dpub;16;A  ;;;0
rpc out;64;A  ;;;0
data access;128;A  ;;;0
collation compatible;256;A  ;;;0
system;512;A  ;;;0
use remote collation;1024;A  ;;;0
27 июл 12, 14:04    [12925396]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить