Linux上的SQL Server>批量导入错误

Tom*_*una 8 linux sql-server bulkinsert docker

尝试将.tsv文件批量插入sql-server-linux docker镜像时,是否遇到此错误:

Referenced external data source "(null)" not found.

这是命令,表存在,文件存在于服务器上:

BULK INSERT countries FROM '/import/file.tsv'
WITH (
  FIELDTERMINATOR = '\t'
);
Run Code Online (Sandbox Code Playgroud)

谢谢托马斯

tek*_*ver 5

我在 Linux 上使用 BULK INSERT 时遇到了很多麻烦,有效的路径名被拒绝:

# sqlcmd -S localhost -d leak -U sa -Q "BULK INSERT leak FROM '/tmp/data.txt'"
Msg 12703, Level 16, State 1, Server mssql, Line 1
Referenced external data source "(null)" not found.

# ll /tmp/data.txt
-rw-r--r-- 1 root root 30M Feb 20 02:40 /tmp/data.txt
Run Code Online (Sandbox Code Playgroud)

建议的用反斜杠替换斜杠并在前面添加 C:\ 的解决方法不起作用:

# sqlcmd -S localhost -d leak -U sa -Q "BULK INSERT leak FROM 'C:\\tmp\\data.txt'"
Msg 12703, Level 16, State 1, Server mssql, Line 1
Referenced external data source "(null)" not found.
Run Code Online (Sandbox Code Playgroud)

因此,我进行了一些调查,通过在守护进程上运行 strace 我发现了这一点:

# strace -fp 3198 -e open
strace: Process 3198 attached with 175 threads
[pid  3202] open("/proc/self/status", O_RDONLY) = 170
[pid  3202] open("/proc/meminfo", O_RDONLY) = 170
[pid  3321] open("/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 175
[pid  3321] open("/tmp/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 175
[pid  3321] open("/tmp/data.txt", O_RDONLY) = 175
[pid  3321] open("/tmp/data.txt", O_RDONLY|O_DIRECT) = -1 EINVAL (Invalid argument)
Run Code Online (Sandbox Code Playgroud)

open() 失败,因为 tmpfs 文件系统不支持 O_DIRECT。因此,我将文件移到了根目录中,并使其可供所有人访问:

# ll /data.txt
-rw-rw-rw- 1 root root 30M Feb 20 02:28 /data.txt

# ll /data.txt
-rw-rw-rw- 1 root root 30M Feb 20 02:28 /data.txt
# sqlcmd -S localhost -d leak -U sa -Q "BULK INSERT leak FROM '/data.txt'"
Msg 4860, Level 16, State 1, Server mssql, Line 1
Cannot bulk load. The file "/data.txt" does not exist or you don't have file access rights.
Run Code Online (Sandbox Code Playgroud)

但这一次服务器甚至不再尝试访问该文件。将文件移动到根目录以外的世界可访问目录中,修复它:

# sqlcmd -S localhost -d leak -U sa -Q "BULK INSERT leak FROM '/media/data.txt'"

(1000000 rows affected)
Run Code Online (Sandbox Code Playgroud)


小智 3

这是 Linux 上的 SQL Server 中与我们处理路径方式有关的错误。我们仍在努力让 SQL Server 中的所有内容都能处理 Linux 路径语法。我已就此提交了一个错误,我们会修复它。同时,您可以将路径指定为 C:\import\file.tsv,其中 C:\ 是 Linux 文件系统根目录的占位符(即“/”),斜杠正好相反。我在 RHEL VM 中测试了这个确切的场景,它工作得很好。专业提示:这个 C:\ 技巧将在 T-SQL 中传递路径的任何地方起作用,因此如果您遇到其他需要路径的问题,请尝试一下。

Bug #9380471 供 Microsoft 内部参考。

  • 这对我不起作用(使用“microsoft/mssql-server-linux”docker 容器并将文件映射到卷中)。还有其他方法让它工作吗? (10认同)
  • 这在 docker 中仍然被破坏。C:\ 样式路径和 *nix 样式/路径都不起作用。令人难以置信的是,这个东西已经被破坏了这么久。 (2认同)