Code:
IF OBJECT_ID('usp_sys_SaveTextToFile') IS NOT NULL DROP PROC usp_sys_SaveTextToFile
GO
/*
DECLARE @Result INT
EXEC @Result = dbo.usp_sys_SaveTextToFile 'this is a test', 'C:\TEMP\test.txt' -- , @NoRaiseError=1
SELECT @Result AS Result
*/
CREATE PROC usp_sys_SaveTextToFile(
@Text NVARCHAR(MAX)
, @FileName VARCHAR(255)
, @Charset VARCHAR(50) = 'UTF-8' -- or 'Windows-1251'
, @NoRaiseError BIT = 0
) AS
SET NOCOUNT ON
DECLARE @RetVal INT
, @HObj INT
, @HResult INT
, @ErrSource VARCHAR(255)
, @ErrDescription VARCHAR(1000)
SELECT @RetVal = 0
BEGIN TRY
EXEC @HResult = dbo.sp_OACreate 'ADODB.Stream', @HObj OUTPUT
IF @HResult <> 0 GOTO QH
EXEC @HResult = dbo.sp_OAMethod @HObj, 'Open'
IF @HResult <> 0 GOTO QH
EXEC @HResult = dbo.sp_OASetProperty @HObj, 'Type', 2 -- adTypeText
IF @HResult <> 0 GOTO QH
IF @Charset IS NOT NULL
BEGIN
EXEC @HResult = dbo.sp_OASetProperty @HObj, 'Charset', @Charset
IF @HResult <> 0 GOTO QH
END
EXEC @HResult = dbo.sp_OAMethod @HObj, 'WriteText', NULL, @Text
IF @HResult <> 0 GOTO QH
EXEC @HResult = dbo.sp_OAMethod @HObj, 'SaveToFile', NULL, @FileName, 2 -- adSaveCreateOverWrite
IF @HResult <> 0 GOTO QH
EXEC @HResult = dbo.sp_OAMethod @HObj, 'Close'
IF @HResult <> 0 GOTO QH
END TRY
BEGIN CATCH
SELECT @RetVal = 1
IF COALESCE(@NoRaiseError, 0) = 0
BEGIN
SELECT @ErrSource = CONVERT(VARCHAR(50), ERROR_LINE())
, @ErrDescription = RTRIM(REPLACE(ERROR_MESSAGE(), CHAR(13) + CHAR(10), ' '))
RAISERROR ('Error on line %s: %s', 16, 1, @ErrSource, @ErrDescription)
END
END CATCH
QH:
IF @HResult <> 0
BEGIN
SELECT @RetVal = 1
IF COALESCE(@NoRaiseError, 0) = 0
BEGIN
EXEC dbo.sp_OAGetErrorInfo @HObj, @ErrSource OUTPUT, @ErrDescription OUTPUT
SELECT @ErrDescription = RTRIM(REPLACE(@ErrDescription, CHAR(13) + CHAR(10), ' '))
RAISERROR ('Error in %s: %s (0x%08X)', 16, 1, @ErrSource, @ErrDescription, @HResult)
END
END
IF @HObj IS NOT NULL
BEGIN
EXEC dbo.sp_OADestroy @HObj
SET @HObj = NULL
END
RETURN @RetVal
GO
This uses ADODB.Stream instances so you have to first