Không phải vì đó là một ý tưởng hay, mà để không ai khác phải tìm ra cách sử dụng các thủ tục được lưu trữ sp_OAxxx khủng khiếp ...
Đây là bản cập nhật cho quy trình lưu trữ HTTP cổ của tôi để sử dụng cả WinHttp và đặt tùy chọn đó. Thuộc tính Option là một "thuộc tính được lập chỉ mục" nên việc gọi nó bằng sp_OASetProperty là wierd.
create or alter procedure get_http @url varchar(2000)
as
begin
/*
exec get_http 'https://www.bing.com'
*/
declare @hr int;
declare @win int;
declare @errorMessage varchar(2000);
begin try
EXEC @hr=sp_OACreate 'WinHttp.WinHttpRequest.5.1',@win OUT
IF @hr <> 0
begin;
set @errorMessage = concat('sp_OACreate failed ', convert(varchar(20),cast(@hr as varbinary(4)),1));
throw 60000, @errorMessage, 1;
end;
EXEC @hr=sp_OAMethod @win, 'Open',NULL,'GET',@url,'false'
IF @hr <> 0
begin;
set @errorMessage = concat('Open failed ', convert(varchar(20),cast(@hr as varbinary(4)),1));
throw 60000, @errorMessage, 1;
end;
--Option is an indexed property, so newvalue = 2048 and index = 9
--sp_OASetProperty objecttoken , propertyname , newvalue [ , index... ]
EXEC @hr=sp_OASetProperty @win, 'Option', 2048, 9
IF @hr <> 0
begin;
set @errorMessage = concat('set Option failed ', convert(varchar(20),cast(@hr as varbinary(4)),1) );
throw 60000, @errorMessage, 1;
end;
EXEC @hr=sp_OAMethod @win,'Send'
IF @hr <> 0
begin;
set @errorMessage = concat('Send failed ', convert(varchar(20),cast(@hr as varbinary(4)),1));
throw 60000, @errorMessage, 1;
end;
declare @status int
EXEC @hr=sp_OAGetProperty @win,'Status', @status out
IF @hr <> 0
begin;
set @errorMessage = concat('get Status failed ', convert(varchar(20),cast(@hr as varbinary(4)),1));
throw 60000, @errorMessage, 1;
end;
if @status <> 200
begin;
set @errorMessage = concat('web request failed ', @status);
throw 60000, @errorMessage, 1;
end;
declare @response table(text nvarchar(max));
insert into @response(text)
EXEC @hr=sp_OAGetProperty @win,'ResponseText';
IF @hr <> 0
begin;
set @errorMessage = concat('get ResponseText failed ', convert(varchar(20),cast(@hr as varbinary(4)),1));
throw 60000, @errorMessage, 1;
end;
select *
from @response
EXEC @hr=sp_OADestroy @win
IF @hr <> 0 EXEC sp_OAGetErrorInfo @win;
end try
begin catch
declare @error varchar(200) = error_message()
declare @source varchar(200);
declare @description varchar(200);
declare @helpfile varchar(200);
declare @helpid int;
exec sp_OAGetErrorInfo @win, @source out, @description out, @helpfile out, @helpid out;
declare @msg varchar(max) = concat('COM Failure ', @error,' ',@source,' ',@description)
EXEC @hr=sp_OADestroy @win;
--IF @hr <> 0 EXEC sp_OAGetErrorInfo @win;
throw 60000, @msg, 1;
end catch
end