T-SQL将数据插入加密列

T-SQL将数据插入加密列,sql,sql-server,encryption,ado,Sql,Sql Server,Encryption,Ado,基于大量研究,我下面的存储过程似乎可以工作。但是,无论是直接在SQLServer17中调用还是通过ADO连接调用,我都会遇到此错误 从数据类型varchar到varchar(255)加密的隐式转换 使用(加密类型='DETERMINISTIC',加密算法名称= “AEAD_AES_256_CBC_HMAC_SHA_256”,列\u加密\u密钥\u名称= “AutoStripes\u Machine\u CEK”,列\u encryption\u key\u database\u name= “A

基于大量研究,我下面的存储过程似乎可以工作。但是,无论是直接在SQLServer17中调用还是通过ADO连接调用,我都会遇到此错误

从数据类型varchar到varchar(255)加密的隐式转换 使用(加密类型='DETERMINISTIC',加密算法名称= “AEAD_AES_256_CBC_HMAC_SHA_256”,列\u加密\u密钥\u名称= “AutoStripes\u Machine\u CEK”,列\u encryption\u key\u database\u name= “AutoStripes”)排序规则\u name='SQL\u Latin1\u General\u CP1\u CI\u AS'不可用 允许

我启用了
Column Encryption Setting=Enabled
,并为始终加密的签入查询选项启用参数化,并且我在使用的机器上有密钥

存储过程如下所示。我使用游标是因为不可能对临时表AFAIK进行加密,所以我想参数化VIN和插入记录后对这些字段执行update语句的位置条件

USE AutoSTripes;
GO 

CREATE PROCEDURE [dbo].[loadVehicles] (@xmlString XML)

AS 

BEGIN

    DECLARE @tempVehs TABLE 
    (
        [ProductNo] [bigint],
        [VersionNo] [bigint],
        [DateAdded] [smalldatetime],
        [UserID] [varchar](255),
        [VehicleYear] [varchar](255),
        [Make] [varchar](255),
        [Model] [varchar](255),
        [VINNumber] [varchar](255), -- matches column that is encrypted
        -- .... more columns
        [VehicleSeqNo] [bigint],
        [CollDed] [varchar](255)
)

    INSERT INTO @tempVehs   
    SELECT
         XD.xTbl.value('./Product[1]', 'bigint') as ProductNo
         ,XD.xTbl.value('./Version[1]', 'bigint') as VersionNo
         ,XD.xTbl.value('./DateAdded[1]', 'smalldatetime') as DateAdded
         ,XD.xTbl.value('./UserID[1]', 'varchar(255)') as UserID
         ,XD.xTbl.value('./VehYear[1]', 'varchar(255)') as VehiclYear
         ,XD.xTbl.value('./Make[1]', 'varchar(255)') as Make
         ,XD.xTbl.value('./Model[1]', 'varchar(255)') as Model
         ,XD.xTbl.value('./Vin[1]', 'varchar(255)') as VinNumber
         -- ... more columns
         ,XD.xTbl.value('./SeqNo[1]', 'bigint') as VehicleSeqNo
         ,XD.xTbl.value('./CollDed[1]', 'varchar(255)') as CollDed
    FROM
        @xmlString.nodes('//VehicleList/Vehicle') AS XD(xTbl)

    INSERT INTO dbo.tVehicle
        (ProductNo, VersionNo, DateAdded, UserID, VehicleYear, Make, Model, GLCity, GLState, GLZip, VehicleType, Radius, Class, VehicleSeqNo, PIP, AddlPIP, MedPay, UMUIM, UMPD, OTCCov, OTCDed, ACVorStated, CollCov, CollDed) 
        SELECT
            ProductNo, VersionNo, DateAdded, UserID, VehicleYear, Make, Model, GLCity, GLState, GLZip,  VehicleType, Radius, Class, VehicleSeqNo, PIP, AddlPIP, MedPay, UMUIM, UMPD, OTCCov, OTCDed, ACVorStated, CollCov, CollDed
        FROM
            @tempVehs


    -- loop temp table and update VIN for each unique record    
    DECLARE @vin varchar(255)
    DECLARE @product bigint
    DECLARE @version bigint
    DECLARE @sequence bigint

    DECLARE @curs CURSOR

    BEGIN

        SET @curs = CURSOR FOR SELECT ProductNo, VersionNo,  VinNumber, VehicleSeqNo FROM @tempVehs
        OPEN @curs
        FETCH NEXT FROM @curs INTO @product, @version, @vin, @sequence

        Set @product = @product
        Set @version = @version
        Set @vin = @vin
        Set @sequence = @sequence

        UPDATE dbo.tVehicle SET VINNumber = @vin WHERE ProductNo = @product AND VersionNo = @version and VehicleSeqNo = @sequence

    END

    close @curs
    deallocate @curs

END

GO

我错过了什么?还是根本不可能?

您的XML文档是否包含加密数据?如果没有,那么它就不会工作。SQL Server无法在本地加密/解密数据(这项技术的全部要点),因为它不包含加密数据@alex。谢谢我认为这就是答案。您的XML文档是否包含加密数据?如果没有,那么它就不会工作。SQL Server无法在本地加密/解密数据(这项技术的全部要点),因为它不包含加密数据@alex。谢谢我觉得这就是答案。