如果函数已经存在,如何删除它?
我知道这一定很简单,但是如何在创建函数之前检查它是否已经存在?如果它存在,我想删除并重新创建它。
I know this must be simple, but how do I preface the creation of a function with a check to see if it already exists? If it exists, I want to drop and re-create it.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
如果您想避免使用 sys* 表,则可以这样做(来自此处:
要捕获的主要内容是您尝试删除的函数类型(在顶部 sql 中用 FN、IF 和 TF 表示):
If you want to avoid the sys* tables, you could instead do (from here in example A):
The main thing to catch is what type of function you are trying to delete (denoted in the top sql by FN, IF and TF):
您还可以在 sysobjects 中查找名称
实际上,如果该函数可以是表函数,您需要使用
You can also look the name up in sysobjects
Actually, if the function could be a table function, you need to use
您有两个选项可以在 SQL Server 2016 中删除并重新创建该过程。
从 SQL Server 2016 开始 - 使用
IF EXISTS
从 SQL Server 2016 SP1 开始 - 使用
或更改
You have two options to drop and recreate the procedure in SQL Server 2016.
Starting from SQL Server 2016 - use
IF EXISTS
Starting from SQL Server 2016 SP1 - use
OR ALTER
这适用于任何对象,而不仅仅是函数:
然后只需添加您的对象风格,如下所示:
This works for any object, not just functions:
then just add your flavor of object, as in:
从
SQL Server 2016 CTP3
开始,您可以使用新的DIE语句而不是大的IF
包装语法:
查询:
更多信息此处
From
SQL Server 2016 CTP3
you can use new DIE statements instead of bigIF
wrappersSyntax :
Query:
More info here
我通常回避从 sys* 类型表进行查询,供应商倾向于在版本、主要版本或其他版本之间更改这些表。我一直所做的就是发出
DROP FUNCTION
语句,而不用担心可能返回的任何 SQL 错误。我认为这是 DBA 领域的标准流程。I usually shy away from queries from sys* type tables, vendors tend to change these between releases, major or otherwise. What I have always done is to issue the
DROP FUNCTION <name>
statement and not worry about any SQL error that might come back. I consider that standard procedure in the DBA realm.这是我对此的看法:
Here's my take on this:
如果您想使用 SQL ISO 标准 INFORMATION_SCHEMA 而不是 SQL Server 特定的
sysobjects
,您可以执行以下操作:If you want to use the SQL ISO standard INFORMATION_SCHEMA and not the SQL Server-specific
sysobjects
, you can do this: