Как направить вывод OPENROWSET () в аргумент оператора INSERT? - PullRequest
0 голосов
/ 19 сентября 2019

Контекст

У меня есть ~ 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)
)

1 Ответ

1 голос
/ 19 сентября 2019

Ensemble varbinary должен быть Ensemble varbinary (max).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...