【问题标题】:Using IF NOT EXISTS to Create Functions [duplicate]使用 IF NOT EXISTS 创建函数
【发布时间】:2015-09-07 10:02:07
【问题描述】:

第一次发帖...

我有许多 SQL 脚本,每次安装 SSRS 报告套件时,我都必须手动运行这些脚本来创建缺失的函数和存储过程。

理想情况下,我想在一段代码中自动执行此操作,因此正在查看 IF NOT EXIST 语句。

我的想法是...检查函数是否退出,如果 Y 移动到下一个脚本,如果 N,运行 CREATE FUNCTION 脚本然后移动到下一个脚本:

IF NOT EXISTS 
(SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[report].[fnR_ActiveCustomers]') 
AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))

CREATE FUNCTION [report].[fnR_ActiveCustomers]
(... etc etc

当我开始这个时,我得到:“create function must be the only statement in the batch”。

谁能帮帮我?

谢谢 李

【问题讨论】:

    标签: sql-server reporting-services stored-functions


    【解决方案1】:

    在两者之间使用GO 来分隔批次:

    IF NOT EXISTS 
    (SELECT * FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'[report].[fnR_ActiveCustomers]') 
    AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
    Go
    CREATE FUNCTION [report].[fnR_ActiveCustomers]
    (... etc etc
    

    【讨论】:

    • 你确定这行得通吗?
    • 是的,它会起作用的。 GO 充当批处理分隔符,因此 Create 语句将位于单独的批处理中,并且也是批处理中的第一个语句。
    • 试一试...如果在 IF 下面没有 DROP,那么第一批没有意义...
    • 它正在检查是否存在然后创建有意义
    • 我不知道这是如何工作的(我尝试过但没有成功) - FWIK,if 子句需要与它将在成功条件下运行的脚本在同一批次中。它没有回答最重要的问题,但我认为 Shnugo 是对的,你会想要使用 If exists 语句,然后如果它存在则删除该函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2018-11-06
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2015-03-29
    • 2011-11-15
    相关资源
    最近更新 更多