我有一个相当简单的插入从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 '\\Server\Data\filename.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
进入table1,显然它会填充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**
谢谢,我希望这是有道理的。
答案 0 :(得分:1)
问题是您的帐户列定义为varchar(32)。
ENCRYPTBYKEY会返回最大尺寸为8000的结果。这只是不适合您的专栏。要么展开列,要么将结果转换为更小的尺寸以使其适合列内。现在它只是不合适。