2009-07-16 26 views
5

EDIT:機能の作成が欠落していた、私が行くT-SQL要求を持っているSQL Serverオブジェクトの存在を確認して削除するにはどうすればいいですか?

について申し訳ありません:

DECLARE @IsSomething bit 
SET @IsSomething = 0 
IF /some tests/ SET @IsSomething = 1 
EXEC(' 
CREATE FUNCTION IsSomething() 
RETURNS bit 
AS 
BEGIN 
    RETURN ' + @IsSomething + ' 
END') 

もちろん、私はそれを2回実行した場合、私は

There is already an object named 'IsSomething ' in the database. 
を取得

どうすればいいですか?

IF EXIST @IsSomething DESTROY @IsSomething // (Pseudo bad code) 
+0

@IsSomethingを2回宣言すると、 '変数名' @IsSomething 'が既に宣言されています。変数名は、クエリバッチまたはストアドプロシージャ内で一意である必要があります。条件/応答が一例として不一致でしたか?もしそうなら、それは人々が少し混乱している質問を見つける理由を説明するかもしれません... –

+0

これはすべて、変数名を除いて、私がやったこととまったく同じです。さらに少し先に私は "SET @IsSomething = 1"を持っています、これを質問に追加します – marcgg

+0

@IsSomethingはデータベースオブジェクトではありません。それはT-SQL変数です。既存のオブジェクトに関するエラーが発生した場合、そのオブジェクトはCREATE [table |ビュー|インデックス| DECLAREではなく、[etc]文を使用します。 –

答えて

7
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id (N'[dbo].[IsSomething]') AND OBJECTPROPERTY(id, N'IsFunction') = 1) 

DROP function IsSomething 
GO 
+0

ドロップ部分が機能していません。私の変数が次のように宣言されている場合:DECLARE @IsSomething bit、どうやって削除すればよいですか? – marcgg

+0

は現実を反映するように編集されています。 IF OBJECT_ID( 'YourObject'、 'ObjectsType')を使用しなかったことに注意してください。これはあまりにも控えめで意図していない可能性がある他のオブジェクトタイプを削除するためです。 –

+1

どうですか、クリス? (私の答えでは、例えば。) –

0

同じグローバル変数を複数回宣言しようとする他の言語に類似しているようです。通常、我々は書いていない:あなたはちょうどあなたが書いているコードの構造を認識する必要がありますように

var a; 
a = 0; 
... 
... 
undefine a; 
a = 1; 
... 
... 
undefine a; 
a = 2; 

は私には思えます。

私は宣言された変数を "データベースオブジェクト"とは考えていません。しかし何らかの理由であなたの質問がより理にかなっています。この

IF OBJECT_ID('YourObject', 'ObjectsType') IS NOT NULL DROP <ObjectsType> [YourObject] 
+0

これは私がデータベースを更新するために使ったスクリプトです。そこには既存のものがあるかもしれないので、それらを削除する必要があります。テーブルでこれを行うのはかなり一般的です。だからこそなぜですか?私は誤っている場合は "データベースオブジェクト"の言語については分かりません – marcgg

+0

"定義"ステートメントは、特定の限定された範囲を持っています。定義された変数は、単一のスクリプトの実行を失うものではなく、添え字として呼ばれない限り、他のスクリプトとやりとりするべきではありません。 – dkretz

+0

それはデータベースに何かを追加しているので、そこにとどまるはずです。私はそれを緩めたくありません。 – marcgg

1

編集した質問への答えは次のとおりです。

if object_id('IsSomething', 'fn') is not null drop function IsSomething 
go 
+0

はい。 A) ""は、オブジェクト型名、すなわち "DROP TABLE [..]"または "DROP INDEX [..]、B)"に置き換えなければならないので、 "bit"はオブジェクト型ではありません。 – RBarryYoung

+1

ああ、あなたはあなたが変数を削除しようとしていることが明らかになるようにあなたの質問を変更しました。あなたはそれを行うことはできません、あなたは別のセッションを開始する必要があります/バッチ(スクリプトでは、GOがこれを行います) – RBarryYoung

4

同様

1

テンプレートは、Visual Studioから2008 Add -> Stored Procedure Scriptは、プロシージャの

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'Stored_Procedure_Name') 
    BEGIN 
     DROP Procedure Stored_Procedure_Name 
    END 

GO 

CREATE Procedure Stored_Procedure_Name 
/* 
    (
     @parameter1 int = 5, 
     @parameter2 datatype OUTPUT 
    ) 

*/ 
AS 


GO 

/* 
GRANT EXEC ON Stored_Procedure_Name TO PUBLIC 

GO 
*/ 

です、SQL Server Ma nagement Studioは、スクリプトが、私はほとんど私がきたほとんどのコードベースでは、後者のフォーム(2行バージョンを)見てきました

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[udf_GetXyz]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) 
DROP FUNCTION [dbo].[udf_GetXyz] 

で生成されています機能のためにも同様に

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_DeleteXyz]') AND type in (N'P', N'PC')) 
DROP PROCEDURE [dbo].[usp_DeleteXyz] 

を削除するには、次のスクリプトを提供します変数を宣言する必要はありません。

関連する問題