SQL Server Requires Chilkat v11.7.0+
SQL Server
Box: Download Binary Content into BinData
See more Box Examples
Run the reusable setup once per HttpCurl object, then select names and execute the operation. The setup is repeated here only to make this published example independently runnable. Download a small file into memory. For large files use the direct-to-disk example.
See the Box API guide for setup and the complete workflow.
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
-- Requires Chilkat 11.7.0 or later and a previously unlocked Chilkat bundle.
-- See Global Unlock Sample.
-- Guide: Box API Guide.
SELECT @success = 0
-- BEGIN ONE-TIME SETUP
-- This block is repeated so each published example can run on its own.
-- In an application, run the setup example once and pass the SAME curl object
-- to operation code below. Do not recreate it for every operation.
-- See Reusable Box HttpCurl Setup.
DECLARE @curl int
EXEC @hr = sp_OACreate 'Chilkat.HttpCurl', @curl OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
EXEC sp_OAMethod @curl, 'SetVar', NULL, 'access_token', 'BOX_ACCESS_TOKEN'
EXEC sp_OAMethod @curl, 'SetVar', NULL, 'parent_name', '/'
-- Box's fixed root ID is an implementation detail; callers supply names.
EXEC sp_OAMethod @curl, 'SetVar', NULL, 'parent_id', '0'
DECLARE @setupCommand int
EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @setupCommand OUT
DECLARE @setupReplacements int
-- Register findParent; registration sends no request.
EXEC sp_OAMethod @setupCommand, 'SetString', @success OUT, 'curl -X GET "https://api.box.com/2.0/folders/0/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"'
EXEC sp_OAMethod @curl, 'GetVar', @sTmp0 OUT, 'access_token'
EXEC sp_OAMethod @setupCommand, 'Replace', @setupReplacements OUT, 'ACCESS_TOKEN', @sTmp0
EXEC sp_OAMethod @setupCommand, 'GetAsString', @sTmp0 OUT
EXEC sp_OAMethod @curl, 'AddFunction', @success OUT, 'findParent', @sTmp0
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @curl, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
RETURN
END
-- Register findFolder; registration sends no request.
EXEC sp_OAMethod @setupCommand, 'SetString', @success OUT, 'curl -X GET "https://api.box.com/2.0/folders/{{parent_id}}/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"'
EXEC sp_OAMethod @curl, 'GetVar', @sTmp0 OUT, 'access_token'
EXEC sp_OAMethod @setupCommand, 'Replace', @setupReplacements OUT, 'ACCESS_TOKEN', @sTmp0
EXEC sp_OAMethod @setupCommand, 'GetAsString', @sTmp0 OUT
EXEC sp_OAMethod @curl, 'AddFunction', @success OUT, 'findFolder', @sTmp0
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @curl, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
RETURN
END
-- Register findFile; registration sends no request.
EXEC sp_OAMethod @setupCommand, 'SetString', @success OUT, 'curl -X GET "https://api.box.com/2.0/folders/{{folder_id}}/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"'
EXEC sp_OAMethod @curl, 'GetVar', @sTmp0 OUT, 'access_token'
EXEC sp_OAMethod @setupCommand, 'Replace', @setupReplacements OUT, 'ACCESS_TOKEN', @sTmp0
EXEC sp_OAMethod @setupCommand, 'GetAsString', @sTmp0 OUT
EXEC sp_OAMethod @curl, 'AddFunction', @success OUT, 'findFile', @sTmp0
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @curl, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
RETURN
END
-- Register findDestination; registration sends no request.
EXEC sp_OAMethod @setupCommand, 'SetString', @success OUT, 'curl -X GET "https://api.box.com/2.0/folders/0/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"'
EXEC sp_OAMethod @curl, 'GetVar', @sTmp0 OUT, 'access_token'
EXEC sp_OAMethod @setupCommand, 'Replace', @setupReplacements OUT, 'ACCESS_TOKEN', @sTmp0
EXEC sp_OAMethod @setupCommand, 'GetAsString', @sTmp0 OUT
EXEC sp_OAMethod @curl, 'AddFunction', @success OUT, 'findDestination', @sTmp0
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @curl, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
RETURN
END
-- Register getFileDetails; registration sends no request.
EXEC sp_OAMethod @setupCommand, 'SetString', @success OUT, 'curl -X GET "https://api.box.com/2.0/files/{{file_id}}?fields=id,sha1,file_version" -H "Authorization: Bearer ACCESS_TOKEN"'
EXEC sp_OAMethod @curl, 'GetVar', @sTmp0 OUT, 'access_token'
EXEC sp_OAMethod @setupCommand, 'Replace', @setupReplacements OUT, 'ACCESS_TOKEN', @sTmp0
EXEC sp_OAMethod @setupCommand, 'GetAsString', @sTmp0 OUT
EXEC sp_OAMethod @curl, 'AddFunction', @success OUT, 'getFileDetails', @sTmp0
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @curl, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
RETURN
END
-- Register getEnterprise; registration sends no request.
EXEC sp_OAMethod @setupCommand, 'SetString', @success OUT, 'curl -X GET "https://api.box.com/2.0/users/me?fields=enterprise" -H "Authorization: Bearer ACCESS_TOKEN"'
EXEC sp_OAMethod @curl, 'GetVar', @sTmp0 OUT, 'access_token'
EXEC sp_OAMethod @setupCommand, 'Replace', @setupReplacements OUT, 'ACCESS_TOKEN', @sTmp0
EXEC sp_OAMethod @setupCommand, 'GetAsString', @sTmp0 OUT
EXEC sp_OAMethod @curl, 'AddFunction', @success OUT, 'getEnterprise', @sTmp0
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @curl, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
RETURN
END
-- Register output rules once. Chilkat 11.7.0 evaluates {{name}} variables
-- when extracting each output, using the current value at that time.
EXEC sp_OAMethod @curl, 'AddOutput2', @success OUT, 'findParent', 'entries', 'name', '{{parent_name}}', 1, 'id', 'parent_id'
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @curl, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
RETURN
END
EXEC sp_OAMethod @curl, 'AddOutput2', @success OUT, 'findFolder', 'entries', 'name', '{{folder_name}}', 1, 'id', 'folder_id'
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @curl, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
RETURN
END
EXEC sp_OAMethod @curl, 'AddOutput2', @success OUT, 'findFile', 'entries', 'name', '{{file_name}}', 1, 'id', 'file_id'
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @curl, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
RETURN
END
EXEC sp_OAMethod @curl, 'AddOutput2', @success OUT, 'findDestination', 'entries', 'name', '{{destination_name}}', 1, 'id', 'destination_id'
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @curl, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
RETURN
END
EXEC sp_OAMethod @curl, 'AddOutput', @success OUT, 'getFileDetails', 'file_version.id', 'file_version_id'
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @curl, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
RETURN
END
EXEC sp_OAMethod @curl, 'AddOutput', @success OUT, 'getFileDetails', 'sha1', 'file_sha1'
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @curl, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
RETURN
END
EXEC sp_OAMethod @curl, 'AddOutput', @success OUT, 'getEnterprise', 'enterprise.id', 'enterprise_id'
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @curl, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
RETURN
END
-- END ONE-TIME SETUP
-- The name lookups below assume each listing fits in one page (1000 items).
-- Parent and destination names select root children; folder_name selects a child
-- of parent_name. "/" selects the root parent. These are not arbitrary paths.
-- BEGIN OPERATION -- keep the configured object when reusing it.
-- Inputs are names. Retain cached IDs when the selected names have not changed.
DECLARE @parentName nvarchar(4000)
SELECT @parentName = '/'
DECLARE @folderName nvarchar(4000)
SELECT @folderName = 'images'
DECLARE @fileName nvarchar(4000)
SELECT @fileName = 'penguins.jpg'
EXEC sp_OAMethod @curl, 'GetVar', @sTmp0 OUT, 'parent_name'
EXEC sp_OAMethod @curl, 'VarDefined', @iTmp0 OUT, 'parent_id'
IF (@sTmp0 <> @parentName) or ((@parentName = '/') and (@iTmp0 = 0))
BEGIN
EXEC sp_OAMethod @curl, 'SetVar', NULL, 'parent_name', @parentName
EXEC sp_OAMethod @curl, 'ClearVar', NULL, 'parent_id'
EXEC sp_OAMethod @curl, 'ClearVar', NULL, 'folder_id'
EXEC sp_OAMethod @curl, 'ClearVar', NULL, 'file_id'
EXEC sp_OAMethod @curl, 'ClearVar', NULL, 'file_version_id'
EXEC sp_OAMethod @curl, 'ClearVar', NULL, 'file_sha1'
IF @parentName = '/'
BEGIN
EXEC sp_OAMethod @curl, 'SetVar', NULL, 'parent_id', '0'
END
END
EXEC sp_OAMethod @curl, 'GetVar', @sTmp0 OUT, 'folder_name'
IF @sTmp0 <> @folderName
BEGIN
EXEC sp_OAMethod @curl, 'SetVar', NULL, 'folder_name', @folderName
EXEC sp_OAMethod @curl, 'ClearVar', NULL, 'folder_id'
EXEC sp_OAMethod @curl, 'ClearVar', NULL, 'file_id'
EXEC sp_OAMethod @curl, 'ClearVar', NULL, 'file_version_id'
EXEC sp_OAMethod @curl, 'ClearVar', NULL, 'file_sha1'
END
EXEC sp_OAMethod @curl, 'GetVar', @sTmp0 OUT, 'file_name'
IF @sTmp0 <> @fileName
BEGIN
EXEC sp_OAMethod @curl, 'SetVar', NULL, 'file_name', @fileName
EXEC sp_OAMethod @curl, 'ClearVar', NULL, 'file_id'
EXEC sp_OAMethod @curl, 'ClearVar', NULL, 'file_version_id'
EXEC sp_OAMethod @curl, 'ClearVar', NULL, 'file_sha1'
END
EXEC sp_OAMethod @curl, 'ClearTargetOutput', NULL, '*'
DECLARE @authorizedCommand1 int
EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @authorizedCommand1 OUT
EXEC sp_OAMethod @authorizedCommand1, 'SetString', @success OUT, 'curl -X GET "https://api.box.com/2.0/files/{{file_id}}/content" -H "Authorization: Bearer {{access_token}}" -L'
DECLARE @headerReplacement1 int
EXEC sp_OAMethod @curl, 'GetVar', @sTmp0 OUT, 'access_token'
EXEC sp_OAMethod @authorizedCommand1, 'Replace', @headerReplacement1 OUT, '{{access_token}}', @sTmp0
EXEC sp_OAMethod @authorizedCommand1, 'GetAsString', @sTmp0 OUT
EXEC sp_OAMethod @curl, 'DoYourThing', @success OUT, @sTmp0
EXEC sp_OAGetProperty @curl, 'StatusCode', @iTmp0 OUT
IF (@success <> 1) or (@iTmp0 <> 200)
BEGIN
EXEC sp_OAGetProperty @curl, 'StatusCode', @iTmp0 OUT
PRINT 'Box request failed. HTTP status: ' + @iTmp0
EXEC sp_OAGetProperty @curl, 'FailReason', @iTmp0 OUT
PRINT 'Failure reason: ' + @iTmp0
EXEC sp_OAGetProperty @curl, 'ResponseBodyStr', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
EXEC @hr = sp_OADestroy @authorizedCommand1
RETURN
END
DECLARE @data int
EXEC @hr = sp_OACreate 'Chilkat.BinData', @data OUT
EXEC sp_OAMethod @curl, 'GetResponseBd', @success OUT, @data
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @curl, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
EXEC @hr = sp_OADestroy @authorizedCommand1
EXEC @hr = sp_OADestroy @data
RETURN
END
EXEC sp_OAGetProperty @data, 'NumBytes', @iTmp0 OUT
PRINT 'Downloaded bytes: ' + @iTmp0
EXEC @hr = sp_OADestroy @curl
EXEC @hr = sp_OADestroy @setupCommand
EXEC @hr = sp_OADestroy @authorizedCommand1
EXEC @hr = sp_OADestroy @data
END
GO