【问题标题】:How to direct the output of OPENROWSET() to an argument of an INSERT statement?如何将 OPENROWSET() 的输出定向到 INSERT 语句的参数?
【发布时间】: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


【解决方案1】:

Ensemble varbinary 应该是 Ensemble varbinary(max)。

【讨论】:

  • 我用Ensemble varbinary(MAX) 删除并重新创建了表,但得到了同样的错误。
  • 还有所有的 nvarchar 列,你需要给出一个长度,例如文件名 nvarchar(128)
猜你喜欢
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 2018-02-24
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多