Sql server 如何检查sql server对象是否存在并删除它?

Sql server 如何检查sql server对象是否存在并删除它?,sql-server,tsql,Sql Server,Tsql,编辑:函数创建丢失,很抱歉 我有一个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 n

编辑:函数创建丢失,很抱歉

我有一个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)

似乎类似于您多次尝试声明同一全局变量的任何其他语言。通常我们不会写:

var a;
a = 0;
...
...
undefine a;
a = 1;
...
...
undefine a;
a = 2;
在我看来,您只需要了解正在编写的代码的结构

我不认为一个声明变量是一个“数据库对象”,BTW.,但是如果你出于某种原因,你的问题更有意义。

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

DROP function IsSomething
GO
IF OBJECT_ID('YourObject', 'ObjectsType') IS NOT NULL DROP <ObjectsType> [YourObject]
如果OBJECT_ID('YourObject','ObjectsType')不是NULL,则删除[YourObject]

您编辑的问题的答案是:

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

该模板来自Visual Studio 2008
Add->Storage 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
*/
对于过程,SQLServerManagementStudio提供了以下要删除的脚本

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]

我在大多数代码库中都看到了后一种形式(两行版本),无需声明变量。

对于SQL Server 2016及更新版本,您可以执行以下操作:

删除数据库(如果存在)[DBName]


ALTER TABLE[TABLENAME]DROP COLUMN IF EXISTS[COLUMNNAME]

这是我用来更新数据库的脚本,其中可能有预先存在的内容,所以我需要删除它们。在表格中这样做是很常见的,那么为什么不使用这个呢?我不确定“database object”语言,如果它误导了您,很抱歉,“define”语句的作用域是有限的。定义的变量不应超过单个脚本的执行时间,也不应与其他脚本交互,除非被称为下标。问题是,它在数据库中添加了一些内容,所以它应该留在那里。我不想失去它。好吧,多亏了Ben M,我才明白。很抱歉,我的问题让人困惑:\n它现在用真正的问题更新了。问题是你的IsSomething(函数)和@IsSomething(变量)是两个截然不同的东西,彼此没有关系。drop部分不起作用。如果我的变量是这样声明的:DECLARE@IsSomething bit,我应该如何删除它?编辑以反映现实。请注意,我没有使用IF OBJECT_ID('YourObject','ObjectsType')不是NULL样式,因为它太草率了,可能会删除您可能不打算使用的其他对象类型。这是怎么回事,Chris?(例如,在我的回答中)从Robert Paulson的回答中,我会说Chris的回答是最好的,但我不确定。这两种方法都有效——我不确定Chris对于其他对象类型被删除意味着什么,因为你不能删除函数表。例如,如果我声明@IsSomething两次,我得到:'变量名'@IsSomething'已经声明。变量名在查询批处理或存储过程中必须是唯一的。'您是否像示例一样使条件/响应不匹配?如果是这样的话,这也许可以解释为什么人们觉得这个问题有点困惑……除了变量名之外,所有这些都是我所做的/我所犯的错误。再往前一点,我还有一个“SET@IsSomething=1”,我将把它添加到question@IsSomething不是数据库对象;这是一个T-SQL变量。如果您对现有对象有错误,那么该对象是使用CREATE[table | view | index |等]语句创建的,而不是DECLARE。非常清楚:您不能“删除”t-SQL变量。噢,谢谢Ben。我更习惯mysql,所以我感到困惑。我查看了脚本(它是遗留的),另一个脚本创建了一些东西。我会把它加到我的问题上是的。因为A)“”必须替换为对象类型名称,即“DROP TABLE[…]或“DROP INDEX[…]和B)”位“不是对象类型,它是域类型,您不能删除它们。啊,我现在明白了,您已经更改了问题,因此很明显您正在尝试删除变量。您不能这样做,您必须启动另一个会话/批处理。(在脚本中,GO将执行此操作)