Как проверить наличие объекта сервера sql и сбросить его? - PullRequest
6 голосов
/ 17 июля 2009

РЕДАКТИРОВАТЬ : создание функции отсутствовало, извините за это

У меня есть запрос T-SQL, который выглядит так:

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

Конечно, если я запускаюдважды я получаю

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

Как бы я сделал что-то вроде этого:

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

Ответы [ 5 ]

9 голосов
/ 17 июля 2009
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id (N'[dbo].[IsSomething]') AND OBJECTPROPERTY(id, N'IsFunction') = 1) 

DROP function IsSomething
GO
4 голосов
/ 17 июля 2009

Ответ на ваш отредактированный вопрос:

if object_id('IsSomething', 'fn') is not null drop function IsSomething
go
1 голос
/ 17 июля 2009

Шаблон из 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 Management Studio выдает следующий скрипт для удаления

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]

аналогично для функции генерируется скрипт

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]

Я чаще всего видел последние формы (двухстрочные версии) в большинстве кодовых баз, над которыми я работал, и нет необходимости объявлять переменную.

1 голос
/ 17 июля 2009

Как это

IF OBJECT_ID('YourObject', 'ObjectsType') IS NOT NULL DROP <ObjectsType> [YourObject]
0 голосов
/ 17 июля 2009

Похоже на любой другой язык, где вы пытаетесь объявить одну и ту же глобальную переменную несколько раз. Обычно мы не пишем:

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

Мне кажется, что вам просто нужно знать структуру кода, который вы пишете.

Я бы не считал объявленную переменную «объектом базы данных», кстати. Но ваш вопрос имеет больше смысла, если по какой-то причине вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...