Return UDF 中的位
Return Bit in UDF
这更特定于 MS SQL(>2008,但主要是版本不可知)。
我希望简化 SQL 服务器中存储过程的检查。
我想要结束的是这样的:
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
当我将这段代码放在一个函数中时,它不起作用,因为我不能 return 来自 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
有人可以提供一些关于正在发生的事情的见解吗?如果你能解决这个函数如何组合成 return 我正在寻找的东西(根据第一个代码块)
或者某个函数可能不适合这种情况。但请说明原因。
只使用 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
这更特定于 MS SQL(>2008,但主要是版本不可知)。
我希望简化 SQL 服务器中存储过程的检查。 我想要结束的是这样的:
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
当我将这段代码放在一个函数中时,它不起作用,因为我不能 return 来自 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
有人可以提供一些关于正在发生的事情的见解吗?如果你能解决这个函数如何组合成 return 我正在寻找的东西(根据第一个代码块)
或者某个函数可能不适合这种情况。但请说明原因。
只使用 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