SQL Server:DECRYPTBYKEY()导致'字符串或二进制数据将被截断。'

时间:2014-08-26 18:06:45

标签: sql-server nvarchar

我正在运行一个SELECT查询,它通过DECRYPTBYKEY()解密一个字段但是我一直遇到错误'字符串或二进制数据会被截断。'

这是我的疑问:

SELECT CONVERT(NVARCHAR(MAX), DECRYPTBYKEY(emailBody)) as emailBody FROM EmailLog 

我已经在网上看了一下,似乎问题是解密的字符串对于NVARCHAR来说太大了。有人能够确认甚至更好 - 提供解决方案吗?我已经被困在这几个小时了,所以任何帮助都会非常感激。

字段emailBody存储为NVARCHAR(MAX),数据库排序规则为Latin1_General_CI_AI_KS_WS。

UPDATE:最后,结果发现此表中有几行实际上没有加密。一旦在结果上运行了DECRYPTBYKEY(),这些行就会导致错误发生。

2 个答案:

答案 0 :(得分:0)

如果您阅读DECRYPTBYKEY()的MSDN文档。此函数的返回数据类型为VARBINARY(8000),因为您在NVARCHAR(MAX)中存储了数据,可能有些数据可能比8000字节大很多。因此错误消息。

一个丑陋的解决方法是在检索数据之前使用以下语句让数据截断并抑制数据截断的错误;

SET ANSI_WARNINGS OFF; 

SELECT CONVERT(NVARCHAR(MAX), DECRYPTBYKEY(emailBody)) as emailBody 
FROM EmailLog; 

答案 1 :(得分:0)

是的,在处理这些功能时,你必须以8000字节的数据块(或者由于某些标题的开销而略微减少)来提供数据。

我最近在我的一个项目中使用证书加密实现了加密层,这些功能仅适用于117字节的块。所以我创建了自己的一组包装器函数,它们在适当的部分中剪切长字符串并在循环中处理它们。工作速度足够快,对尺寸没有限制。你也可以这样做。