在UDF中返回位

时间:2017-04-06 20:28:04

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

这更具体到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

有人可以提供一些有关正在发生的事情的见解吗?如果你能解决这个函数如何组合以返回我正在寻找的东西(按照第一个代码块)

或者某个功能可能不适用于此场景。但请说明原因。

1 个答案:

答案 0 :(得分:3)

如何使用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