我在 SQL Server 2017 中有一个由受密码保护的对称密钥加密的列。在服务器上,我可以sp_foo
从另一个存储过程中调用,如下所示:
declare @symkey_password varchar(50) = 'Where would we be without stackoverflow'
exec sp_foo @id, @symkey_password
sp_foo
我们有这个:
create procedure sp_foo
@id int, @symkey_password varchar(50)
as
begin
set @openkey = 'open symmetric key MY_SYM_KEY decryption by password = ' + quotename(@symkey_password,'''') + ';'
exec sp_executesql @openkey;
select name, convert(varchar(100), decryptbykey(myencryptedcolumn)) as plaintext
from T
where id = @id
CLOSE SYMMETRIC KEY MY_SYM_KEY;
end
这在服务器端工作得很好。
但是,在客户端,当我在 a 中将 @id 和 @symkey_password 作为标准参数传递SqlCommand
并尝试使用时SqlDataAdapter.Fill
:
string pass = "Where would we be.... etc etc";
var c = new SqlCommand();
c.CommandText = "sp_foo";
c.CommandType = CommandType.StoredProcedure;
c.Parameters.Add(new SqlParameter("@id",12345);
c.Parameters.Add(new SqlParameter("@symkey_password, SqlDbType.VarChar, 50);
c.Parameters["@symkey_password"].Value = pass;
var DA = new SqlAdapter(c);
DataTable T;
DA.Fill(T);
有时我会收到以下错误:
超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)
有时我会得到这个:
密钥未使用指定的解密器加密。密钥“MY_SYM_KEY”未打开。使用前请打开钥匙。
当存储过程调用时,在 C# 中调用存储过程客户端的正确方法是什么sp_executesql
?