Sql server 如何将此函数从oracle转换为sql server
如何将此函数从Oracle转换为SQL ServerSql 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
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;