如何将此功能 oracle 转换为 sql 服务器

How to convert this function oracle to sql server

如何将此功能从 Oracle 转换到 SQL 服务器?

FUNCTION PorcImpuesto (pCompania IN VARCHAR2)
      RETURN FLOAT
   AS
      vImpuesto   FLOAT;
      vLink       VARCHAR (100);
      vTipoIva    VARCHAR (10);

BEGIN
      SELECT NVL (DBLINK, ''), IMPUESTO
        INTO vLink, vTipoIva
        FROM SAV_PAIS
       WHERE COMPANIA = pCompania;

        EXECUTE IMMEDIATE   'SELECT (NVL(IMPUESTO1,0) / 100) 
                    FROM '
                           || pCompania
                           || '.IMPUESTO'
                           || vLink
                           || '
                   WHERE IMPUESTO = '''
                           || vTipoIva
                           || ''''
             INTO vImpuesto;

          RETURN vImpuesto;
       EXCEPTION
          WHEN NO_DATA_FOUND
          THEN
             RETURN 0;
          WHEN OTHERS
          THEN
             RETURN 0;
       END;
CREATE FUNCTION APEX.PORCIMPUESTO
(
    @pCompania      VARCHAR(4000) 
)
RETURNS FLOAT 
AS 
    BEGIN
        DECLARE @vImpuesto      FLOAT 
        DECLARE @vLink          VARCHAR(100) 
        DECLARE @vTipoIva       VARCHAR(10) 

        SELECT  @vLink  =  ISNULL(DBLINK, ''),
                @vTipoIva  =  IMPUESTO
        FROM    SAV_PAIS 
        WHERE   COMPANIA  = @pCompania

        EXECUTE 'SELECT (ISNULL(IMPUESTO1,0) / 100) 
                FROM '
                       || @pCompania
                       || '.IMPUESTO'
                       || vLink
                       || '
               WHERE IMPUESTO = '''
                       || vTipoIva
                       || ''''
         INTO vImpuesto;

      RETURN @vImpuesto;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         RETURN 0;
      WHEN OTHERS
      THEN
         RETURN 0;
   END;

很难说 - 我没有你的桌子和任何东西 - 但你需要 一些东西 像这样......

CREATE FUNCTION APEX.PORCIMPUESTO (@pCompania VARCHAR(4000))
RETURNS DECIMAL(20, 4)  -- or whatever precision you need
AS 
BEGIN
    DECLARE @vImpuesto DECIMAL(20, 4)
    DECLARE @vLink     VARCHAR(100) 
    DECLARE @vTipoIva  VARCHAR(10) 

    SELECT  
        @vLink  =  ISNULL(DBLINK, ''),
        @vTipoIva  =  IMPUESTO
    FROM   
        SAV_PAIS 
    WHERE   
        COMPANIA  = @pCompania

    -- declare a NVARCHAR variable to hold the SQL statement you want to execute
    DECLARE @SqlStmt NVARCHAR(1000)

    -- define the SQL query to execute - and **PLEASE** use parameters wherever possible!
    SET @SqlStmt = N'SELECT (ISNULL(IMPUESTO1, 0) / 100) FROM ' + @pCompania + N'.IMPUESTO' + vLink + N' WHERE IMPUESTO = @TipoIva';

    -- try/catch to handle exceptions
    BEGIN TRY
        -- execute the stored procedure and channel data into temporary table
       INSERT INTO #vImpuesto
           EXEC sp_executesql @stmt = @SqlStmt, @params = N'@TipoIva VARCHAR(10)', @TipoIva = @vTipoIva

       -- select all columns, all rows from that temporary table as returned result set
       SELECT *
       FROM #vImpuesto
    END TRY
    BEGIN CATCH
       -- handle your exception case here
    END
END;