我正在尝试从使用“始终加密”功能加密的列中检索值。在SSMS中,我已指定“列加密设置=已启用”连接选项,并且还启用了“为始终加密启用参数化”设置。
此查询由其自身执行,按预期方式工作。
DECLARE @value varchar(25) = '345'
SELECT PrivateID
FROM TestDB.dbo.tblData
WHERE PrivateID = @value
但是,如果我尝试将其放入存储过程中
ALTER PROCEDURE dbo.Test
AS
BEGIN
DECLARE @value varchar(25) = '345'
SELECT PrivateID
FROM TestDB.dbo.tblData
WHERE PrivateID = @value
END
GO
我收到错误消息:
第156条消息,第15级,状态1,第1行
关键字“ PROCEDURE”附近的语法不正确。第156条消息,第15级,状态1,第1行
关键字“ PROCEDURE”附近的语法不正确。第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行]
无法准备声明。消息8180,级别16,状态1,过程sp_describe_parameter_encryption,第1行[批处理开始第0行]
无法准备声明。消息8180,级别16,状态1,过程sp_describe_parameter_encryption,第1行[批处理开始第0行]
无法准备声明。执行批处理时发生错误。错误消息是:内部错误。语句或过程'ALTER PROCEDURE dbo.Test'中参数'@ p850913a51d1247f290af5a8e7dd24f25'的元数据 如 开始 十进制@value AS VARCHAR(25)= @ p850913a51d1247f290af5a8e7dd24f25; 选择私人ID 从TestDB.dbo.tblData 在哪里PrivateID = @value; sp_describe_parameter_encryption返回的结果集中缺少“ END”。
使用存储过程从始终加密的列中获取结果的正确方法是什么?
答案 0 :(得分:0)
我通过MSDN论坛帖子“ always encrypted query within stored procedure”找出了导致此错误的原因。
当尝试创建(或更改)在SSMS中启用了参数化的存储过程时,这是在我看到原始帖子中的错误之前,跟踪已提交给服务器的内容(参考sp_describe_parameter_encryption)
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}" x:Key="StyleKey">
<Setter Property="Background" Value="{StaticResource SteelBrush}"/>
…
</Style>
要完成我要测试的内容,我只需要在下面创建简单的存储过程即可。
exec sp_describe_parameter_encryption N'ALTER PROCEDURE [dbo].[Test]
AS
BEGIN
DECLARE @value AS VARCHAR (25) = @p9f7f4f9078e14e1e8b661791c0c1348a;
SELECT PrivateID
FROM TestDB.dbo.tblData
WHERE PrivateID = @value;
END
',N'@p9f7f4f9078e14e1e8b661791c0c1348a varchar(25)'
然后在SSMS中启用参数设置,按如下所示执行它。
ALTER PROCEDURE dbo.Test
@PrivateID varchar(25)
AS
BEGIN
SELECT PrivateID
FROM TestDB.dbo.tblData
WHERE PrivateID = @PrivateID
END