今天我安装了 Microsoft SQL Server Management Studio(SSMS)的版本13.0.15800.18 [2016-09-20,16.4],现在它拒绝编辑我的存储过程。我甚至在我的另一台计算机上尝试了一个稍微旧的版本以确保它们在那里打开就好了。我收到错误:
StoredProcedure'xyz'的脚本失败。 (Microsoft.SqlServer.Smo)
其他信息:
StoredProcedure'xyz'的TextHeader中的语法错误。 (Microsoft.SqlServer.Smo)
一些旧帖子(1,2,3)在线讨论这是由于在“ALTER PROCEDURE”之前嵌套了评论(或者通常只是在某处的程序中)。就我而言,在最近的SSMS更新之后,我的脚本都没有打开。我在另一台使用较旧版本SSMS的计算机上查看了一个更简单的脚本,而整个事情中唯一的注释是一个简单的自动生成的注释:
/ ******对象:StoredProcedure [dbo]。[xyz]脚本日期:9/21/2016 12:55:48 PM ****** /
有没有其他人在2016-09-20 SSMS更新后遇到此问题,有没有人有解决方案?
更新1: lhsoftware 使用创建的提示(下方)可用于打开程序。我尝试修改其中一个简单的程序,完全没有任何注释,在尝试修改时,我仍然遇到“脚本失败”错误!我甚至在sp_helptext
后检查了这个程序,实际上它不包含任何斜杠(/)或星号(*)。
更新2 :Microsoft已正式撤销此更新,并显示以下消息(找到here):
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)中得到解决。对我来说,安装16.4.1后,修改和改变都会再次工作。
答案 0 :(得分:3)
Microsoft SQL团队发布了一个解决此问题的更新(版本13.0.15900.1):( Download SQL Server Management Studio (16.4.1))
请注意版本13.0.15800.18的变通方法:工具 - >选项 - > SQL Server对象资源管理器 - >脚本 - >将用户定义的数据类型转换为基本类型= True
添加" 执行作为调用者"到存储过程和标量函数
安装版本:13.0.15800.18即使卸载并安装旧版本(Previous SQL Server Management Studio Releases),问题仍然存在
答案 1 :(得分:1)
这也发生在我身上 - 它似乎是最新更新的常见问题。
有人为MS记录了一个错误,其中包含一些您可以在此处执行的活动:https://connect.microsoft.com/SQLServer/Feedback/Details/3103831
目前的解决方法是更新工具 - >选项 - > SQL Server对象资源管理器 - >脚本 - >将用户定义的数据类型转换为基本类型= True,但这可能会产生一些意想不到的后果。
我目前正在使用SSMS 2014。希望他们能很快得到解决方案(虽然我不会碰到我的手指)。
答案 2 :(得分:1)
"脚本存储过程>创建To"将工作。您可以手动将其更改为Alter。 jhipp的建议也有效。
注意:
"脚本存储过程>改变"将返回与"修改"相同的错误
答案 3 :(得分:1)
Microsoft了解此问题并发布了包含修复
的高质量版本公开发行版https://connect.microsoft.com/SQLServer/feedback/details/3103831
答案 4 :(得分:0)
此外,不是从SSMS修改SP,而是尝试将其编写为Alter To
新查询窗口。
答案 5 :(得分:0)
这是一个错误,我希望很快就能解决。我使用的解决方法是:使用CREATE脚本选项并自行将CREATE更改为ALTER。这里建议:https://connect.microsoft.com/SQLServer/Feedback/Details/3103831。
答案 6 :(得分: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
DECLARE @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
错误消失了。