【问题标题】:Return Bit in UDFUDF 中的返回位
【发布时间】:2017-04-06 20:28:04
【问题描述】:

这更特定于 MS SQL(>2008,但主要与版本无关)。

我希望简化 SQL Server 中存储过程的检查。 我想结束的是这样的:

IF (dbo.PROC_EXISTS(N'MY_STORED_PROC_NAME') = 1)
    DROP PROCEDURE MY_STORED_PROC_NAME
GO

我目前拥有的:

SELECT
CAST(
    CASE 
        WHEN EXISTS (
            SELECT  *
            FROM    sys.objects
            WHERE   object_id = OBJECT_ID(N'GET_ALT_SCHEDULE')
                        AND type IN (N'P', N'PC')
        ) 
        THEN 'TRUE' 
        ELSE 'FALSE'
        END 
AS BIT
)

RETURNS 1 -- TRUE
RETURNS 0 -- FALSE

当我将此代码放在函数中时,它不起作用,因为我无法返回来自 select 语句的值。

CREATE FUNCTION PROC_EXISTS(@SPName NVARCHAR)
    RETURNS BIT
AS

BEGIN

DECLARE @Answer BIT

SET @Answer = SELECT  -- Incorrect syntax near 'SELECT'
    CAST(
        CASE 
            WHEN EXISTS (
                SELECT  *
                FROM    sys.objects
                WHERE   object_id = OBJECT_ID(@SPName)
                           AND type IN (N'P', N'PC')
            ) 
            THEN 1 
            ELSE 0
            END 
    AS BIT
    )
RETURN @Answer
END

有人可以提供一些关于发生了什么的见解吗?如果您可以解决如何组合此函数以返回我正在寻找的内容(根据第一个代码块)

或者某个函数可能不适合这种情况。但请说明原因。

【问题讨论】:

    标签: sql .net sql-server user-defined-functions


    【解决方案1】:

    只用object_id()怎么样?

    if object_id(N'dbo.proc_name') is not null 
    drop procedure dbo.proc_name;
    

    更正您的功能代码:

    您的输入被指定为nvarchar,没有大小,因此默认长度为1。改为sysname

    删除select,因为您已经在使用set。或者,您可以删除 set 并使用 select @Answer = cast ...

    create function proc_exists (@spname sysname)
    returns bit as
    begin;
      declare @Answer bit;
      set @Answer = case when exists (
          select *
          from sys.objects
          where object_id = object_id(@spname) 
            and type in (N'P', N'PC')
          ) 
          then 1 else 0 end;
      return @Answer;
    end;
    go
    

    rextester 演示:http://rextester.com/EYWVBY20177

    【讨论】:

    • 谢谢!这正是我想要的。从现在开始,我可能只会使用 object_id() is not null 。这就是我真正想要的。也欣赏矿石对功能的深入解释。很高兴看到这一点。
    • @EdwinJackson 乐于助人!
    猜你喜欢
    • 2019-03-28
    • 2011-05-09
    • 2021-11-21
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多