将流程输出显示为文件的替代解决方案
还有其他方便的方法可以解决这个问题。如果您想上传简单的 CSV,我的解决方案很好,对于更复杂的情况 write a format file。
使用十六进制代码换行 (-r 0x0a) 也很方便,但它不适用于 Ubuntu 18.04 上的 BCP 版本 17.6.0001.1。
所以我改用了一个小技巧:
用sed 替换unix 行尾,并将其输出流显示为文件。相关部分代码:
<(< iris.csv sed 's/\r*$/\r/')
如下所示,sed 的输出显示为文件:
ls <(< iris.csv sed 's/\r*$/\r/')
输出:
/proc/self/fd/11
一个完整的例子
我在工作目录中有iris.csv:
> head -n 5 iris.csv
sepal_length,sepal_width,petal_length,petal_width,species
5.1,3.5,1.4,0.2,setosa
4.9,3.0,1.4,0.2,setosa
4.7,3.2,1.3,0.2,setosa
4.6,3.1,1.5,0.2,setosa
我可以像这样使用 bcp 加载到 MS SQL 中:
query=$(cat << EOF
IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='iris' and xtype='U')
CREATE TABLE iris (
sepal_length FLOAT NOT NULL,
sepal_width FLOAT NOT NULL,
petal_length FLOAT NOT NULL,
petal_width FLOAT NOT NULL
)
GO
EOF
)
sqlcmd \
-S localhost,31433 \
-E \
-d "testdb" \
-Q "$query"
bcp \
iris in <(< iris.csv sed 's/\r*$/\r/') \
-S localhost,31433 \
-T \
-d "testdb" \
-n \
-t ","
通知
-
使用这种语法将进程输出流呈现为文件是一种 bashism,因此不适用于其他一些 shell,例如 dash。它将与 zsh 一起使用
-
我为 AD 使用了 Windows 集成身份验证,是的,在 Linux 上可以使用 kerberos 进行此操作。这就是为什么-E 标志为sqlcmd 和-T 标志为bcp。