我想在我的数据库中通过脚本创建新函数。脚本代码如下:
IF Exists(Select * From sys.sysobjects A Where A.name =N'fn_myfunc' and xtype=N'FN') return;
CREATE FUNCTION fn_myfunc ()
returns varchar(10)
AS Begin
...
End
但是当我执行上面的脚本时,SQL Server 会返回一个错误:
'CREATE FUNCTION' must be the first statement in a query batch.
2017 年 1 月更新 - SQL Server 2016+ / Azure SQL 数据库
SQL Server 2016 和当前版本的 Azure SQL 数据库现在具有以下用于函数、过程、表、数据库等的语法 (
DROP IF EXISTS
):SQL Server 2016 Service Pack 1 为模块(函数、过程、触发器、视图)添加了更好的功能,这意味着不会丢失权限或依赖项 (
CREATE OR ALTER
):这两种语法增强都可以使用于源代码控制、部署等的脚本更加简单。
但是,如果你使用...
旧版本
当您从 Management Studio 编写脚本时,您需要执行 SQL Server 的操作:
或者你可以说:
或者你可以说:
(如果该函数尚不存在,您将在此处收到错误消息,但脚本将从下一个 GO 继续,因此无论放置是否有效,该函数仍将(重新)创建。)
请注意,如果您删除该函数并重新创建它,您将失去权限和潜在的依赖信息。
您可以选择检查对象是否存在于 中
database
,如果不存在则创建:这个错误是不言自明的。有几种方法可以修复它。
在 Management Studio 中使用
GO
伪关键字和DROP
/CREATE
对象将脚本分成不同的批次。(请注意,关键字本身可以在 Management Studio 选项中更改,但这是事实上的设置,所以我建议不要理会它)。当您运行脚本(或脚本的选定部分)时,Management Studio 会在
GO
s 之间分隔每个脚本块,并按顺序将这些部分作为单独的批次发送到 SQL Server。使用动态 SQL 从另一个批次中发送一个单独的批次。
这是首选方法,因为这样您的脚本不依赖外部功能来正确执行。例如,如果你的应用程序有一个数据库更新程序,一般来说它会加载一个脚本文件,然后在目标服务器上执行它。要么您必须像 Management Studio 那样添加逻辑来分离批次(注意:充满危险),或者以整个脚本可以作为单个批次成功执行的方式编写脚本。
如另一个答案中所述,您可以使用此方法(或/
CREATE
的其他组合等)进行测试/。如果对象不存在,我更喜欢创建一个存根对象,然后使用它来实际进行创建或更改。这种方法不会删除依赖项,例如权限或扩展属性,并且不需要复制/粘贴容易出错的逻辑来在单个语句中执行/ 。DROP
CREATE
ALTER <object>
CREATE
ALTER
这是我用于创建或更改标量函数的模板。我将把它作为练习留给读者以使其适应其他类型的对象(存储过程、触发器等)。