sql-server - 在 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 帮助。
解决方案
我建议使用内联表值函数而不是标量函数。为确保这是一个内联表值函数,它必须是单个 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';
推荐阅读
- javascript - 如何保护你的 JS 库不受另一个库修改全局对象原型的影响
- python-3.x - 为什么 Speech_recognition 不再起作用?
- python - Python Generator 抽象基类没有实现必要的__del__,这是故意的吗?
- node.js - 找不到模块'webpack-cli/bin/config-yargs'
- reactjs - 如何在 Material UI 中覆盖 .MuiTypography-body1 类
- javascript - 导航栏过渡动画仅在向上滚动时
- windows - 自动执行 ipconfig/release 然后在计时器上执行 ipconfig/renew 的程序
- sql - 将 WHERE 子句与 SELECT 语句一起使用会提高还是降低性能?
- javascript - 这个函数是什么使它不是一个函数
- c# - 如何阻止 ASP.NET 在 GET 操作方法中注入对象