由于加密消息,无法将存储过程添加到数据库

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

当我在远程服务器上运行相同的代码时,它可以毫无问题地完成。知道是什么原因造成的吗?

Joe*_*Joe 5

这可能是由 Always Encrypted 功能引起的。

如果您不打算使用参数化。您可以在声明它们后手动设置所有变量。
例如:
DECLARE @DB_String varchar(55)
SET @DB_String ='Redesign'

或者,您可以右键单击查询->连接->更改连接->选项>>定位到[附加连接参数]页面->在该框区域中,输入:
列加密设置=禁用,
这也会禁用参数化。

如果您确实需要参数化来加密这些变量,那么目前看来您只能在查询级别执行此操作。存储过程不适用于 Always Encrypted,因为它可以被其他设置了不同列加密设置的用户调用。