我有一个相当简单的从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的结果。那不适合写在你的专栏里。展开列,或将结果强制转换为较小的大小以使其适合列内。现在就是放不下