sql >> データベース >  >> RDS >> Sqlserver

WinHttp.WinHttpRequest.5.1 forTLS1.2を使用してSQLServerストアドプロシージャでオプション9を設定します

    それは良い考えではありませんが、恐ろしいsp_OAxxxストアドプロシージャの使用方法を他の人が理解する必要がないようにするためです...

    これは、WinHttpとそのオプションの両方を使用するための私の古いHTTPストアドプロシージャの更新です。 Optionプロパティは「インデックス付きプロパティ」であるため、sp_OASetPropertyを使用して呼び出すのは奇妙です。

    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
    



    1. MySQL警告1287を修正:「BINARYexpr」は非推奨であり、将来のリリースで削除される予定です

    2. ユニットテストの使用が高品質アーキテクチャへの大きな投資である理由

    3. Oracle21cをSQLServerに接続する

    4. OracleデータベースのINDICES-OFバインド句を含むFORALLステートメント