【发布时间】:2020-01-20 13:43:00
【问题描述】:
上下文
我有大约 3225 万、2KB 传感器二进制数据文件(总计 32.25E6*2/(1024^3) = 61.5 GB)的数据,我想放入 Microsoft SQL 数据库表(Microsoft SQL Server 2014)。该表使用以下方式定义:
CREATE TABLE station_binaries (
StationID int,
StationName nvarchar,
Timestamp datetime2(7),
InstrumentNumber int,
Folder nvarchar,
Filename nvarchar,
Ensemble varbinary(MAX)
)
Ensemble 存储 2 KB 数据。我正在编写一个 T-SQL 查询来测试将记录插入到该表中。成功后,我将使用 Python 和pyodbc 以编程方式将数据插入到表中。
问题陈述
根据this advice,我尝试创建类似的查询并遇到错误:
消息 8152,级别 16,状态 4,行 2 字符串或二进制数据将是 截断。声明已终止。
尝试执行时:
INSERT INTO GCOOS.dbo.station_binaries (StationID, StationName, [Timestamp], InstrumentNumber, Folder, [Filename], Ensemble)
VALUES (
42861,
'DeepwaterNautilus',
DATETIME2FROMPARTS(2005,5,2,0,3,0,0,0),
0,
'C:\Users\mtran\Desktop\...\ndbc_data\_42861_Deepwater_Nautilus\2005\05\02\',
'428610200505020003.bin',
(SELECT * FROM OPENROWSET(BULK 'C:\Users\...\42861_Deepwater_Nautilus\2005\05\02\428610200505020003.bin', SINGLE_BLOB) result)
)
我认为这与调用 OPENROWSET() 的 SELECT 子查询的语法有关。子查询自己执行 OK:
SELECT * FROM OPENROWSET(BULK 'C:\Users\...\42861_Deepwater_Nautilus\2005\05\02\428610200505020003.bin', SINGLE_BLOB) result
0x7F7F7F0500081...
解决方案
PeterHe 的建议解决了这个错误。我更改了数据库表声明,以便所有nvarchar 都读取nvarchar(MAX):
CREATE TABLE station_binaries (
StationID int,
StationName nvarchar(MAX),
Timestamp datetime2(7),
InstrumentNumber int,
Folder nvarchar(MAX),
Filename nvarchar(MAX),
Ensemble varbinary(MAX)
)
【问题讨论】:
-
错误似乎在告诉你这里的问题;你要截断一个值。显然,您的列在表
station_binaries中找不到足够的。
标签: sql-server tsql