2017-04-06 9 views
1

これは、MS SQL(> 2008、しかしほとんどの場合、バージョンに依存しない)に特有です。UDFのリターンビット

私は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 

誰かが何が起こっているかについていくつかの洞察を提供できますか?この関数がどのようにして私が探しているものを返すように構成できるかについての解答ができる場合(最初のコードブロックごとに)

おそらくこのシナリオでは関数が適切ではありません。しかし、理由を述べてください。

答えて

2

ちょうどobject_id()を使用するのはどうですか?

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

あなたの関数のコードを修正するには:

あなたの入力はサイズなしnvarcharとして指定し、その代わりにsysname 1.変更し、それをの長さにそれがデフォルトされます。

すでにsetを使用しているので、selectを削除してください。また、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

+0

ありがとう!これはまさに私が探していたものです。おそらくobject_id()を使用することになります。それが私が本当に求めていたものです。機能についての鉱石の深い説明もあきらめてください。そのことを実際に見ることは素晴らしいことです。 – EdwinJackson

+0

@EdwinJackson喜んで助けてください! – SqlZim