SQL Server
SQL Server
Write Text at a 32-bit Offset in a Remote SFTP File
See more SFTP Examples
Demonstrates the Chilkat SFtp.WriteFileText32 method, which encodes text and writes it at a specific 32-bit byte offset in an open handle. The arguments are the handle, the offset, the charset, and the text.
Background: Explicit-offset writes enable random access — patching a fixed-length record in place, for instance, without rewriting the whole file. The offset is a byte position, not a character position, so with a variable-width encoding like UTF-8 you must account for the encoded size of preceding characters to land where you intend. After the write, the sequential position continues just past the bytes written.
Chilkat SQL Server Downloads
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
DECLARE @hr int
DECLARE @iTmp0 int
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @success = 0
-- Demonstrates the SFtp.WriteFileText32 method, which encodes text and writes it at a specific
-- 32-bit byte offset in an open handle. The 1st argument is the handle, the 2nd is the offset,
-- the 3rd is the charset, and the 4th is the text.
DECLARE @sftp int
EXEC @hr = sp_OACreate 'Chilkat.SFtp', @sftp OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
-- Connect, authenticate, and initialize the SFTP subsystem.
DECLARE @port int
SELECT @port = 22
EXEC sp_OAMethod @sftp, 'Connect', @success OUT, 'sftp.example.com', @port
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @sftp, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @sftp
RETURN
END
-- Normally you would not hard-code the password in source. You should instead obtain it
-- from an interactive prompt, environment variable, or a secrets vault.
DECLARE @password nvarchar(4000)
SELECT @password = 'mySshPassword'
EXEC sp_OAMethod @sftp, 'AuthenticatePw', @success OUT, 'mySshLogin', @password
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @sftp, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @sftp
RETURN
END
EXEC sp_OAMethod @sftp, 'InitializeSftp', @success OUT
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @sftp, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @sftp
RETURN
END
-- Open the remote file for read/write so an existing file can be modified in place.
DECLARE @handle nvarchar(4000)
EXEC sp_OAMethod @sftp, 'OpenFile', @handle OUT, 'subdir/record.dat', 'readWrite', 'openOrCreate'
EXEC sp_OAGetProperty @sftp, 'LastMethodSuccess', @iTmp0 OUT
IF @iTmp0 = 0
BEGIN
EXEC sp_OAGetProperty @sftp, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @sftp
RETURN
END
-- Overwrite 5 bytes starting at offset 10. The offset is a byte position, not a character
-- position, so it must account for the encoded size of any multibyte characters.
DECLARE @offset int
SELECT @offset = 10
EXEC sp_OAMethod @sftp, 'WriteFileText32', @success OUT, @handle, @offset, 'utf-8', 'HELLO'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @sftp, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @sftp
RETURN
END
EXEC sp_OAMethod @sftp, 'CloseHandle', @success OUT, @handle
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @sftp, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @sftp
RETURN
END
PRINT 'Wrote at the specified offset.'
EXEC sp_OAMethod @sftp, 'Disconnect', NULL
EXEC @hr = sp_OADestroy @sftp
END
GO