簡體   English   中英

操作數類型沖突:varchar 與 varchar(255) 使用 Always Encrypted with Secure Enclaves 和 CASE 語句不兼容

[英]Operand type clash: varchar is incompatible with varchar(255) Using Always Encrypted with Secure Enclaves and CASE statement

我正在嘗試從案例語句中從數據庫中返回一個加密值。

DECLARE @emptyValue VARCHAR(255) = '';
Select Top 1 CASE WHEN o.shippingFirstName = @emptyValue AND o.shippingLastName = @emptyValue  

THEN '' ELSE o.shippingFirstName  END AS nameDisplay  from [Order] o 

當我運行它時,我收到以下錯誤

Msg 206, Level 16, State 2, Line 20 Operand type clash: varchar is incompatible with varchar(255) encrypted with (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK1', column_encryption_key_database_name = 'cfg_phoenix_prod') collation_name = 'Latin1_General_BIN2' Msg 206, Level 16, State 2, Line 20 Operand type clash: varchar is incompatible with varchar(255) encrypted with (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK1', column_encryption_key_database_name = 'cfg_phoenix_prod') collation_name = 'Latin1_General_BIN2' Msg 206, Level 16, State 2, Line 20 Operand type clash: varchar is incompatible with varchar(255) encrypted with (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_na me = 'CEK1', column_encryption_key_database_name = 'cfg_phoenix_prod') collation_name = 'Latin1_General_BIN2' Msg 206, Level 16, State 2, Line 20 Operand type clash: varchar is incompatible with varchar(255) encrypted with (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK1', column_encryption_key_database_name = 'cfg_phoenix_prod') collation_name = 'Latin1_General_BIN2' Msg 206, Level 16, State 2, Line 20 Operand type clash: varchar is incompatible with varchar(255) encrypted with (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK1', column_encryption_key_database_name = 'cfg_phoenix_prod') collation_name = 'Latin1_General_BIN2' Msg 8180, Level 16, State 1, Procedure sp_describe_parameter_encryption, Line 1 [Batch Start Line 17] Statement(s ) 可以 不准備。 消息 8180,級別 16,State 1,過程 sp_describe_parameter_encryption,第 1 行 [批處理開始第 17 行] 無法准備語句。 消息 8180,級別 16,State 1,過程 sp_describe_parameter_encryption,第 1 行 [批處理開始第 17 行] 無法准備語句。 消息 8180,級別 16,State 1,過程 sp_describe_parameter_encryption,第 1 行 [批處理開始第 17 行] 無法准備語句。 消息 8180,級別 16,State 1,過程 sp_describe_parameter_encryption,第 1 行 [批處理開始第 17 行] 無法准備語句。 執行批處理時出錯。 錯誤信息是:內部錯誤。 語句或過程“DECLARE @emptyValue AS VARCHAR (255) = @pc2d5b410384a4500b3493a0306f71d28”中參數“@pc2d5b410384a4500b3493a0306f71d28”的元數據;

SELECT TOP 1 CASE WHEN o.shippingFirstName = @emptyValue AND o.shippingLastName = @emptyValue THEN ' ' ELSE o.shippingFirstName END AS nameDisplay FROM [Order] AS o;

' 在 sp_describe_parameter_encryption 返回的結果集中缺失。

比較似乎工作正常。 只有當 ELSE 嘗試返回產生問題的 o.shippingFirstName 時。

類似這樣的查詢可以正常工作:

DECLARE @emptyValue VARCHAR(255) = ''; 
Select Top 1 o.shippingFirstName   from [Order] o  where o.shippingFirstName is not Null and o.shippingFirstName <> @emptyValue

有什么我遺漏或無法完成的嗎?

茫然和困惑

因為這些列是使用 Always Encrypted 加密的,所以服務器根本無法讀取它們。 只有客戶端可以解密它們。 它無法將列值與未加密的變量進行比較,它們根本不兼容。 您可以做的唯一操作是將列與另一個加密值進行比較。

它沒有辦法將它們與任何東西進行比較。 相反,您需要刪除@emptyValue變量的聲明並將其作為參數直接從客戶端傳遞。

如果您使用的是隨機加密,您甚至不能這樣做,您只需將其返回給客戶端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM