将VARCHAR转换为VARBINARY的SQL截断问题



我有一个相当简单的从csv文件插入到一个临时表到一个具有加密列的表。

CREATE TABLE table1
(number varchar(32) NOT NULL
, user_varchar1 varchar(65) NOT NULL
, account varchar(32) NOT NULL)
CREATE TABLE #temp1
(number varchar(32) NOT NULL
, user_varchar1 varchar(65) NOT NULL
, account varchar(32) NOT NULL)

OPEN SYMMETRIC KEY SKey                    
DECRYPTION BY CERTIFICATE CERTCERT 
--Flat File Insert
BULK INSERT #temp1 
FROM '\ServerDatafilename.csv'
WITH (FIELDTERMINATOR = ','
, FIRSTROW =2
, ROWTERMINATOR = 'n'
);
INSERT INTO table1
(number, user_varchar1, account_encrypted)
SELECT user_varchar1, number
, ENCRYPTBYKEY(KEY_GUID('SKey'),(CONVERT(varbinary(MAX), account)))
FROM #temp1
--SELECT * FROM #esa_import_ach
DROP TABLE #temp1
SELECT * FROM table1
CLOSE MASTER KEY
CLOSE SYMMETRIC KEY SKey;

我收到的错误是

Msg 8152, Level 16, State 11, Line 40
字符串或二进制数据将被截断。

现在如果我允许NULLS进入表1,它显然会被NULLS填满。如果我完全省略account_encrypted列,脚本就可以工作。

如果我使用

INSERT INTO table1 (number, user_varchar1, account) 
VALUES ('175395', '87450018RS', ENCRYPTBYKEY(KEY_GUID('SKey'), (CONVERT(varbinary(MAX), account)))

没有问题。

所以,我执行BULK INSERT的方式是否有问题,是我对数据类型的声明还是源文件本身。

源文件看起来像这样(只有一行):

emp_id, number, account
175395, 87450018RS,GRDI27562**CRLF**
谢谢,我希望这是有意义的。

问题是您的帐户列被定义为varchar(32)。

ENCRYPTBYKEY返回一个最大大小为8000的结果。那不适合写在你的专栏里。展开列,或将结果强制转换为较小的大小以使其适合列内。现在就是放不下

最新更新