Dar*_*976 4 sql-server ssms sql-server-2017
我设置了一个本地数据库(SQL Server 2017 Express)。一切正常,但是在 SSMS 中创建一个简单的存储过程时我也会出错。
例如,这
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
Run Code Online (Sandbox Code Playgroud)
不会运行,我收到错误消息:
消息 156,级别 15,状态 1,第 1 行
关键字“PROCEDURE”附近的语法不正确。消息 156,级别 15,状态 1,第 1 行
关键字“PROCEDURE”附近的语法不正确。消息 8180,级别 16,状态 1,过程 sp_describe_parameter_encryption,第 1 行 [批处理起始行 0]
无法准备语句。消息 8180,级别 16,状态 1,过程 sp_describe_parameter_encryption,第 1 行 [批处理起始行 0]
无法准备语句。执行批处理时发生错误。错误信息是:内部错误。sp_describe_parameter_encryption 返回的结果集格式无效。结果集之一丢失。
我不确定是什么导致了这种情况,或者数据库中是否存在损坏,因为数据库中有加密,而且我不确定它在调用什么。
我还注意到批处理中的第一个 SQL 语句下面有一条蓝线,上面写着
@DB_String 将被转换为 System.Data.SqlClient.SqlParameter 具有以下属性:SqlDbType = varchar,Size 55, Precision=0
当我在远程服务器上运行相同的代码时,它可以毫无问题地完成。知道是什么原因造成的吗?
这可能是由 Always Encrypted 功能引起的。
如果您不打算使用参数化。您可以在声明它们后手动设置所有变量。
例如:
DECLARE @DB_String varchar(55)
SET @DB_String ='Redesign'
或者,您可以右键单击查询->连接->更改连接->选项>>定位到[附加连接参数]页面->在该框区域中,输入:
列加密设置=禁用,
这也会禁用参数化。
如果您确实需要参数化来加密这些变量,那么目前看来您只能在查询级别执行此操作。存储过程不适用于 Always Encrypted,因为它可以被其他设置了不同列加密设置的用户调用。