【问题标题】:Quick way to modify MS SQL stored procedure修改 MS SQL 存储过程的快速方法
【发布时间】:2013-01-29 10:17:59
【问题描述】:

我需要经常编辑 Microsoft SQL 存储过程,我发现传统方式(打开 MSSMS -> 展开数据库树,展开存储过程树并按 SP 的名称定义过滤器)很长。我正在寻找一种像“sp_helptext”这样的方式(命令行),但它实际上会为我打开存储过程进行编辑。

谢谢。

【问题讨论】:

  • 使用EXEC sp_HelpText 'Procedure Name'。复制结果并将其粘贴到ssms并使用Alter Procedure而不是create来修改sp。但是最好的选择是使用filter而不是这样做Stored Procedure folder 中的设置。
  • 编写脚本并保存到文件中,保留在桌面上:o
  • 为什么要直接编辑存储过程?您应该在源代码控制中使用 SQL 脚本,因此您打开脚本,编辑它,然后执行它来修改过程。有很多方法可以做到这一点,具体取决于您喜欢的工具和源代码控制系统,但直接编辑数据库对象是一个非常糟糕的主意。

标签: sql-server stored-procedures ssms


【解决方案1】:

没有像

这样的直接命令
MODIFY dbname.schemaname.spname

除了使用 SSMS 的传统 GUI 方式之外,您有 3 个使用 TSQL 的选项

EXEC sp_helptext dbname.schemaname.spname';

SELECT OBJECT_DEFINITION (OBJECT_ID(dbname.schemaname.spname'));

SELECT definition
FROM sys.sql_modules
WHERE object_id = (OBJECT_ID(dbname.schemaname.spname'));

很遗憾,所有这些选项都会导致格式丢失。

您试图在这里混合使用两种技术。

  1. SQL 和 SQL 语法
  2. SQL 管理工具

可能无法使用 TSQL 来操作 Management Studio,而这正是您想要的。恐怕剪切和粘贴是您唯一的选择。

拉吉

【讨论】:

    【解决方案2】:

    有一种方法:我开发 SSMSBoost - SSMS 插件。它允许直接从 SQL 编辑器打开对象脚本。

    1. 在 SQL 编辑器中将光标放在存储过程名称上

    2. 按 F2,程序将在新窗口中编写脚本。

    按 Ctrl-F2 将在对象浏览器树中定位对象,因此您可以右键单击它使用更多 SSMS 命令。

    希望这会有所帮助。

    【讨论】:

    • 我更喜欢开源实用程序。你认识一个吗?
    • 有一些开源插件,但它们不执行此问题中所要求的操作。我的加载项不是开源的,但目前可以免费使用
    【解决方案3】:

    查看 Redgate SQL 提示。有了这个,您可以右键单击存储过程的名称,然后单击“ALTER”

    RED GATE SQL PROMPT

    【讨论】:

    • 我发现有时 RED GATE 会显示缓存中的内容,而不是最新版本...可能是因为我使用的是旧版本。
    • 有一个刷新建议,我倾向于不时点击
    • 如果您尝试实验功能(您可以在 SQL 提示菜单中找到它们),您可以启用自动刷新建议选项。
    【解决方案4】:

    永远不要使用 SSMS(或 SSMS 插件)为存储的过程编写脚本以进行更改。应该始终直接从源代码管理中打开存储的过程。如果源代码管理中没有这些对象,则需要这样做。 SP 是代码,它们需要像其他代码一样对待。从源代码控制系统之外编辑sps脚本是不负责任的。

    【讨论】:

      【解决方案5】:

      您可以使用以下代码运行 sp_helptext 过程,该过程将返回一个行表,您可以将其写入将创建存储过程的文件。然后,您可以将文件名传递到 SSMS 命令行,以便在 sql server manager 打开时直接打开该文件。

      ex) Ssms tempFile.sql

      using (SqlConnection con = new SqlConnection ("Connection String Here"))
      {
          using (SqlCommand cmd = con.CreateCommand())
          {
              cmd.CommandText = "sp_helptext @procName";
              cmd.CommandType = CommandType.Text;
      
              cmd.Parameters.AddWithValue("procName", "Name Of Stored Proc Here");
      
              con.Open(); 
      
              using (SqlDataReader rdr = cmd.ExecuteReader())
              {
                  while (rdr.Read())
                  {
                      /* 
                      You will get the CREATE PROC text here
                      Do what you need to with it. For example, write
                      to a .sql file
                      */
                  }
              }
          }
      }
      

      【讨论】:

        【解决方案6】:

        使用这个

        SELECT ROUTINE_DEFINITION from INFORMATION_SCHEMA.ROUTINES
        where ROUTINE_NAME = 'YourStoredProcedureName'
        

        希望这会有所帮助。

        【讨论】:

          【解决方案7】:

          如果您决定忽略此处关于源代码管理的建议,一种快速的方法是在您的桌面上创建一个可以轻松启动的 .sql 文件,其中包含以下内容。

          SELECT o.name, m.definition AS [Copy This Definition], o.type_desc, o.create_date, o.modify_date 
          FROM sys.sql_modules m INNER JOIN sys.objects o ON m.object_id = o.object_id
          WHERE o.name='the_SP_in_question' -- <<<<<< SP/Func to search for
          

          在 F5 之前根据需要编辑 SP 名称,然后将结果中的定义复制到新查询中。当然,将CREATE 更改为ALTER

          很遗憾,MS 还没有为此提供标准命令,它会有它的用途。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-09
            • 2010-11-02
            • 1970-01-01
            相关资源
            最近更新 更多