Sql server 如何将此函数从oracle转换为sql server

Sql server 如何将此函数从oracle转换为sql server,sql-server,oracle,function,Sql Server,Oracle,Function,如何将此函数从Oracle转换为SQL Server FUNCTION PorcImpuesto (pCompania IN VARCHAR2) RETURN FLOAT AS vImpuesto FLOAT; vLink VARCHAR (100); vTipoIva VARCHAR (10); BEGIN SELECT NVL (DBLINK, ''), IMPUESTO INTO vL

如何将此函数从Oracle转换为SQL Server

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 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;

向我们展示你目前的努力!创建函数APEX.porcimputesto(@pCompania VARCHAR(4000))请不要将代码样本或样本数据放入注释中-因为您无法对其进行格式化,所以读取它非常困难。。。。取而代之的是:通过编辑你的问题来更新它,以提供额外的信息!谢谢。您可能还记得sql server中的标量函数通常性能很差。这是两个主要优点:我会避免使用
浮点
数据类型,因为它容易出现舍入错误;其次,T-sql中的字符串串联运算符是
+
-而不是
|
…好的,你帮我从执行到返回@vImpuesto;请注意,这种编码方式对sql注入是完全开放的。您不应该直接执行作为参数接收的字符串值。
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;