首页 > 解决方案 > 在 SQL-Server 中重写 Oracle 函数

问题描述

我有一个需要转换为 SQL-Server 函数的 Oracle 函数

这是 Oracle 函数:

FUNCTION check_education(in_crs_code IN VARCHAR2)
    RETURN BOOLEAN IS
    v_bool            BOOLEAN := FALSE;
    v_dummy            VARCHAR2(1);

    CURSOR find_education  IS
        SELECT 'x'
          FROM KU_LIBRARY_EDUCATION_EXTLOAN
         WHERE UPPER(course_code) = UPPER(in_crs_code) AND in_use = 'Y';
BEGIN
    OPEN find_education;

    FETCH find_education     INTO v_dummy;

    IF find_education%FOUND THEN
        v_bool        := TRUE;
    ELSE
        v_bool        := FALSE;
    END IF;

    CLOSE find_education;

    RETURN (v_bool);
END check_education;

这是我在 SQL-Server 中编写的用于复制 Oracle 功能的内容:

   CREATE FUNCTION [dbo].[check_education](@in_crs_code VARCHAR(4000))
    RETURNS BIT AS
BEGIN
    DECLARE @v_bool BIT = 0;
    DECLARE @v_dummy VARCHAR(1);

    DECLARE find_education CURSOR LOCAL  FOR
        SELECT 'x'
          FROM [dbo].[KU_LIBRARY_EDUCATION_EXTLOAN]
         WHERE UPPER(course_code) = UPPER(@in_crs_code) 
         AND in_use = 'Y';

    OPEN find_education;

    FETCH find_education INTO @v_dummy;

    IF @@CURSOR_ROWS >1 BEGIN
        SET @v_bool = 1;
    END
    ELSE BEGIN
        SET @v_bool = 0;
    END 

    CLOSE find_education;
    DEALLOCATE find_education;

    RETURN (@v_bool);
END;

如果光标返回“x”,我希望 SQL 服务器函数返回 1,但我得到 0。将不胜感激 Anu 帮助。

标签: sql-serveroracle

解决方案


我建议使用内联表值函数而不是标量函数。为确保这是一个内联表值函数,它必须是单个 select 语句。这意味着不能有循环和其他东西。幸运的是,这个查询实际上不需要任何循环。一个简单的计数将返回行数。转换为位时,除 0 以外的任何值都将始终为 1。

CREATE FUNCTION [dbo].[check_education]
(
    @in_crs_code VARCHAR(4000)
) RETURNS table as return

    SELECT CourseExists = convert(bit, count(*))
    FROM [dbo].[KU_LIBRARY_EDUCATION_EXTLOAN]
    WHERE UPPER(course_code) = UPPER(@in_crs_code) 
        AND in_use = 'Y';

推荐阅读