如何判断 ALTER PROCEDURE 是不是有效?

Posted

技术标签:

【中文标题】如何判断 ALTER PROCEDURE 是不是有效?【英文标题】:How to tell if ALTER PROCEDURE worked?如何判断 ALTER PROCEDURE 是否有效? 【发布时间】:2019-10-29 20:07:00 【问题描述】:

我对 SQL 和 SQL Server 还是很陌生。我正在尝试从通过 C# 代码调用的.sql 文件运行ALTER PROCEDURE 查询。在继续确保我的查询完成它应该做的之前,我想验证我的 ALTER PROCEDURE 查询实际上改变了过程,但我不知道如何验证。

例如,在 SQL Server 中,我可以看到我正在尝试编辑的存储过程位于:

 - database-name
     - Programmability/
         - Stored Procedures/
          - dbo.MyStoredProcedure

如果我的ALTER TABLE 查询正常工作,我可以在此处查看我的程序代码,还是可以在其他地方查看?还是我想错了?


【问题讨论】:

如果它不起作用,这意味着它引发了一个异常,您可以在 c# 代码的 catch 块中捕获该异常。这当然是假设您正在针对您的数据库执行代码块。 显示您的应用代码。很大程度上取决于您如何执行该 SQL 文件。 请记住,更改 SP 时有两个不同的阶段,一个是实际的 alter 命令,它将解析新的 SP 代码,另一个阶段是 编译 这将在 SP 被更改后第一次执行时完成。是的,如果修改成功,如果您在您提到的路线上通过 SSMS 打开 SP 代码,您应该会看到更新的代码。 【参考方案1】:

通常,我们依靠错误和异常消息来告诉我们什么时候这样的事情没有奏效。但是,我认为过程 Alter-ed 可能不是预期的过程(当然,这意味着名称/路径/调用构造中的错误)。

在这种情况下,您可以从sys.sql_modules 表中获取任何 SQL 模块(过程、视图、触发器等,任何基于脚本的内容)的当前文本:

SELECT definition FROM sys.sql_modules 
WHERE object_id=OBJECT_ID('dbo.UserSamples_Insert')

您应该注意,通常当这种情况发生而没有错误消息时,是因为:

    您在错误的数据库中执行(例如,当您打算在 DEV 中使用 PROD 时,反之亦然),或者 您没有使用正确的架构(因为您可以创建和使用 'dbo' 以外的架构)。

等等,你说ALTER PROCEDURE 两次,然后你说第三次ALTER TABLE。它是哪一个?我问是因为与几乎所有其他 SQL 对象不同,表不是基于脚本的,并且在任何 Sql 脚本存储库(如 sys.sql_modules)中都找不到它们的定义。我实际上使用了 SMO(来自客户端)或 @SeanLange 多年前为此编写的工具(来自服务器本身)。

【讨论】:

以上是关于如何判断 ALTER PROCEDURE 是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

SQLITE 在alter表添加列时怎么判断表中是不是已经存在列

MySQL存储过程(PROCEDURE)

MySQL procedure drop权限问题

如何强制 Microsoft Database Project 为主键约束生成 ALTER 语句而不是创建临时表?

如何监控oracle的alter日志

python-判断alter是否存在