問題
最近同事透過 SSMS 針對加密欄位查詢時,會發生運算元類型衝突
的錯誤,如下,
訊息 206,層級 16,
運算元類型衝突: varchar 與 nvarchar(300) encrypted with (encryption_type = ‘DETERMINISTIC’, encryption_algorithm_name = ‘AEAD_AES_256_CBC_HMAC_SHA_256’,…) 不相容
解法
SQL 如下,
1 | SELECT top 1 加密欄位 FROM DOC |
查看一下錯誤訊息想說 SQL 不是會自動 Convert 嗎?
即然不行,就手動 Convert 成 nvarchar(300)。
1 | SELECT top 1 加密欄位 FROM DOC |
結果錯誤變成了,運算元類型衝突: nvarchar 與 nvarchar(300) encrypted ... 不相容
後來參考使用 Always Encrypted 與 SQL Server Management Studio 查詢資料行,
與加密欄位打交道,需要使用參數才行,
如果是 Where 條件,則有可能會是 equal to 運算子中的資料類型 nvarchar(300) encrypted with ... 不相容
所以 SQL 要改成以參數的方式,如下,
1 | declare @r nvarchar(300) = ''; |
- 註:在執行 SQL 時,請確認該機器有安裝憑證,不然會有
無法使用金鑰存放區提供者 'MSSQL_CERTIFICATE_STORE' 解密資料行加密金鑰
的錯誤哦
參考資源
使用 Always Encrypted 與 SQL Server Management Studio 查詢資料行
一把柴火不拾,燒啥? : 喻人做事毫無準備,難達願望。