6

今天我安装了Microsoft SQL Server Management Studio (SSMS) [2016-09-20, 16.4]版本 13.0.15800.18 ,现在它拒绝编辑我的存储过程。我什至在我的另一台计算机上尝试了一个稍旧的版本以确保它们在那里打开得很好。我得到错误:

在此处输入图像描述

StoredProcedure 'xyz' 的脚本失败。(Microsoft.SqlServer.Smo)

附加信息:

StoredProcedure 'xyz' 的 TextHeader 中的语法错误。(Microsoft.SqlServer.Smo)

一些旧帖子(123)在线谈论这是由于在“ALTER PROCEDURE”之前(或通常在某个程序中)有嵌套评论引起的。就我而言,在最近的 SSMS 更新之后,我的脚本都没有打开。我在另一台使用旧版本 SSMS 的计算机上查看了我的一个更简单的脚本,整个过程中唯一的评论是一个简单的自动生成的评论,内容如下:

/****** 对象:StoredProcedure [dbo].[xyz] 脚本日期:9/21/2016 12:55:48 PM ******/

SSMS 2016-09-20 更新后有没有其他人遇到过这个问题,有没有人有解决方案?

更新 1: lhsoftware的使用Create To的提示(如下)可用于打开程序。我尝试修改其中一个简单的程序,使其完全没有注释,但在尝试修改它时仍然出现“脚本失败”错误!之后我什至检查了这个过程sp_helptext,确实它不包含任何斜杠 (/) 或星号 (*)。

更新 2: Microsoft 已正式取消更新,并带有以下消息(在此处找到):

SSMS 16.4 版本存在一个已知问题,我们已将下载回滚到 SSMS 16.3。问题解决后,我们将更新下载链接。

如果您已安装 SSMS 16.4 并希望恢复到 SSMS 16.3,则必须在安装 SSMS 16.3 之前卸载 SSMS 16.4。

更新 3:该错误已在版本 16.4.1 (13.0.15900.1) 中得到解决。对我来说,ModifyAlter To都在安装16.4.1后再次工作。

4

7 回答 7

3

Microsoft SQL 团队发布了解决此问题的更新(版本 13.0.15900.1):(下载 SQL Server Management Studio (16.4.1)

请注意版本 13.0.15800.18 的解决方法:工具 -> 选项 -> SQL Server 对象资源管理器 -> 脚本 -> 将用户定义的数据类型转换为基本类型 = True

正在向存储过程和标量函数添加“ EXECUTE AS CALLER ”

安装版本后:13.0.15800.18 即使您卸载并安装旧版本(以前的 SQL Server Management Studio 版本),问题仍然存在

于 2016-09-24T17:29:36.377 回答
1

这也发生在我身上——这似乎是最新更新的一个常见问题。

有人为 MS 记录了一个错误,其中有一些您可以在此处关注的活动:https ://connect.microsoft.com/SQLServer/Feedback/Details/3103831

当前的解决方法是更新工具 -> 选项 -> SQL Server 对象资源管理器 -> 脚本 -> 将用户定义的数据类型转换为基本类型 = True,但这可能会产生一些意想不到的后果。

与此同时,我目前正在使用 SSMS 2014。希望他们能尽快解决(尽管我没有交叉手指)。

于 2016-09-21T20:12:55.820 回答
1

“脚本存储过程为 > 创建到”将起作用。您可以手动将其更改为 Alter。jhipp 的建议也有效。

笔记:

“Script Stored Procedure As > Alter To”将返回与“Modify”相同的错误

于 2016-09-21T21:36:31.713 回答
1

Microsoft 已意识到此问题,并发布了包含修复程序的质量版本公开版本

https://connect.microsoft.com/SQLServer/feedback/details/3103831

于 2016-09-25T13:49:07.623 回答
0

此外,不要从 SSMS 修改 SP,而是尝试将其编写为Alter To新查询窗口的脚本。

于 2016-09-21T19:49:20.507 回答
0

这是一个错误,我希望很快会有修复。我使用的解决方法是:使用 CREATE 脚本选项并自行将 CREATE 更改为 ALTER。此处建议:https ://connect.microsoft.com/SQLServer/Feedback/Details/3103831 。

于 2016-09-22T07:54:35.030 回答
0

有几种方法可以取回存储过程的文本。我发现唯一对返回的字符数没有限制的是 syscomments 表。

您可以使用此命令恢复完整的存储过程。它将从存储过程中返回一个包含 4000 个字符元素的数组。每个数组元素将包含存储过程中的几行 - 在 4000 个字符限制命中的任何地方都被分解。将所有行复制到您的 SQL 编辑器,然后通过编辑器中的行重新加入在每个 4000 个字符集末尾拆分的行。

选择文本

syscomments c

inner join sys.procedures p on p.object_id = c.id

在哪里

p.name = 'stored procedure name'

当我搜索错误时,这是​​我在代码开头的注释中发现的:

/* 使用 GBDB

声明 @intErrorCode INT、@vchErrorMessage VARCHAR(25)、@RunReport INT = 1

IF (@RunReport = 1) 开始

   IF (OBJECT_ID('tempdb.dbo.#tblspLocal_CalculateNeedsList') IS NOT NULL)
   BEGIN
          DROP TABLE #tblspLocal_CalculateNeedsList
   END

   CREATE TABLE #tblspLocal_CalculateNeedsList (
          Id                                              INT IDENTITY,
          ReportSection                     INT,
   /*
   Section 1 - Grinds Needed
   */

在这种情况下,它是由嵌套 /* */ 注释标签引起的。

我将评论的那部分替换为:

   --Section 1 - Grinds Needed

错误消失了。

于 2020-03-13T11:42:16.210 回答