Контекст
У меня есть ~ 32,25 миллиона файлов двоичных данных датчика 2 КБ (объемом 32,25-66 * 2 / (1024 ^ 3) = 61,5 ГБ) данных, которые я хотел бы поместить в 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 КБ данных.Я пишу запрос T-SQL, чтобы проверить вставку записи в эту таблицу.В случае успеха я программно вставлю данные в таблицу, используя Python и pyodbc .
Постановка задачи
Per этот совет , который я пытался создатьаналогичный запрос и обнаружена ошибка:
Сообщение 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)
)
Я думаю, что это связано с синтаксисом подзапроса SELECT, который вызывает OPENROWSET ().Сам подзапрос выполняет ОК самостоятельно:
SELECT * FROM OPENROWSET(BULK 'C:\Users\...\42861_Deepwater_Nautilus\2005\05\02\428610200505020003.bin', SINGLE_BLOB) result
0x7F7F7F0500081 ...
Решение
PeterHe Предложение решило ошибку.Я изменил объявление таблицы базы данных так, чтобы все nvarchar
read 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)
)