SQL Server 2017 Express创建存储过程失败:加密提示与语法错误
解决SQL Server 2017 Express创建存储过程时的Msg 156语法错误
看起来你遇到的问题有点奇怪——其他数据库操作都正常,偏偏创建存储过程时触发语法错误,还伴随加密提示。我帮你梳理几个最可能的排查方向,按顺序试试:
1. 先确认数据库上下文和批处理分隔符
很多时候这个错误都是因为没切对数据库,或者没正确分隔批处理导致的。你代码里用到了Redesign数据库,但有没有在创建存储过程前明确切换过去?
- 试试给代码加上
USE语句和GO分隔符,确保批处理正确执行:USE Redesign; GO CREATE PROCEDURE [dbo].[EMS_Operations_SyncAssetTableByID2] @Table_Name VARCHAR(255), @Ids_For_Update VARCHAR(255), @Is_Test BIT = 0 AS BEGIN DECLARE @DB_String varchar(55) ='Redesign' END GOGO是SSMS的批处理分隔符,它会确保前一句的USE语句生效后,再执行创建存储过程的代码,避免上下文混乱。
2. 排查加密相关的干扰因素
你提到有加密提示,先排除连接或数据库加密设置的影响:
- 检查SSMS连接属性:打开连接窗口时,点击“选项”,在“加密连接”下拉框里切换成“可选”,重新连接后再试创建存储过程。有时候强制加密的连接设置会引发一些奇怪的兼容性问题。
- 确认目标数据库的加密状态:执行下面的语句看看
Redesign是否启用了透明数据加密(TDE):
如果SELECT name, is_encrypted FROM sys.databases WHERE name = 'Redesign';is_encrypted返回1,虽然TDE本身不会影响存储过程语法,但可以确认一下数据库的证书/密钥是否正常(不过大概率不是这个导致的语法错误,先做个排查)。
3. 检查SSMS的查询模式和数据库兼容性
- 关闭SQLCMD模式:点击SSMS顶部的「查询」菜单,看看“SQLCMD模式”是否被勾选,如果是,取消勾选再试——SQLCMD模式会解析一些特殊语法,可能干扰普通的存储过程创建。
- 确认数据库兼容性级别:SQL Server 2017的默认兼容性级别是140,如果你的
Redesign数据库是从旧版本迁移过来的,低兼容性级别可能引发语法兼容问题:
如果级别低于140,执行下面的语句修改:SELECT name, compatibility_level FROM sys.databases WHERE name = 'Redesign';ALTER DATABASE Redesign SET COMPATIBILITY_LEVEL = 140;
4. 排查隐藏的特殊字符
有时候复制粘贴的代码里会混入看不见的全角空格、非ASCII字符,导致SQL解析报错。你可以把代码复制到Notepad++这类编辑器,开启“显示所有字符”功能,检查是否有异常字符,然后重新复制回SSMS执行。
5. 快速验证权限和最简代码
先创建一个最简化的存储过程,排除参数或逻辑的干扰:
USE Redesign; GO CREATE PROCEDURE dbo.TestProc AS BEGIN PRINT 'Test Procedure'; END GO
如果这个能成功,说明之前的代码里可能有细微的语法问题(比如参数定义的空格、符号),再逐步添加参数和逻辑排查。如果还是报错,就检查当前用户的权限:
USE Redesign; GO SELECT HAS_PERMS_BY_NAME(NULL, 'DATABASE', 'CREATE PROCEDURE') AS HasCreateProcPermission;
如果返回0,说明当前用户没有创建存储过程的权限,需要执行授权:
GRANT CREATE PROCEDURE TO [YourLoginName];
内容的提问来源于stack exchange,提问作者Daryl1976
相关产品推荐
相关产品推荐

