Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Задайте опция 9 в съхранената процедура на SQL Server, като използвате WinHttp.WinHttpRequest.5.1 за TLS 1.2

Не защото е добра идея, а за да не се налага никой друг да разбира как да използва ужасните съхранени процедури sp_OAxxx...

Ето актуализация на моята древна HTTP съхранена процедура, за да използвам WinHttp и да зададем тази опция. Свойството 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Външен ключ към композитен ключ

  2. съхранени процедури с sqlAlchemy

  3. Не може да се намери нито колона dbo, нито дефинираната от потребителя функция, нито агрегат dbo.Splitfn, или името е двусмислено

  4. Създайте тригер „Вместо“ в SQL Server

  5. Стойност на производителността на водачите COMB