SQL截断问题将VARCHAR转换为VARBINARY

时间:2014-07-29 20:26:30

标签: sql sql-server-2008 varchar varbinary

我有一个相当简单的插入从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**

谢谢,我希望这是有道理的。

1 个答案:

答案 0 :(得分:1)

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

ENCRYPTBYKEY会返回最大尺寸为8000的结果。这只是不适合您的专栏。要么展开列,要么将结果转换为更小的尺寸以使其适合列内。现在它只是不合适。