【问题标题】:Multi-line SQL query using bcp in batch批量使用 bcp 的多行 SQL 查询
【发布时间】:2016-12-08 09:51:27
【问题描述】:

我创建了一个批处理文件,它使用 bcp 从一系列 SSMS 查询中输出数据。

为了可读性和维护性,我想将每个查询设置为跨多行的变量,我会在 bcp 调用中引用它,例如:

SET myQuery = 
"select a, b, c, d "
 "from tableA a "
 "inner join tableB b "
 "on a.Id = b.ID "
 "where a.value < .99 "
 "order by a.Id " 


bcp %myQuery% queryout C:\myDir\filenameOut.txt -S ServerName -T -c

我发现克拉运算符做了类似的事情,因此申请了:

SET myQuery = 
"select a, b, c, d " ^
 "from tableA a " ^
 "inner join tableB b " ^
 "on a.Id = b.ID " ^
 "where a.value < .99 " ^
 "order by a.Id "

无济于事。错误信息说:

"[第一行内容] 不被识别为内部或外部 命令、可运行的程序或批处理文件。”

这让我觉得这些行没有正确连接。

我意识到批处理文件通常不能很好地处理这样的多行操作,但是有没有一种直接的方法可以实现这一点?

【问题讨论】:

  • 关键字周围需要更多空格。
  • @GordonLinoff, 'keywords' 表示 SQL 查询的内容?

标签: sql sql-server batch-file bcp


【解决方案1】:
"select a, b, c, d" ^
 "from tableA a" ^
 "inner join tableB b" ^
 "on a.Id = b.ID" ^
 "where a.value < .99" ^
 "order by a.Id"

我希望会变成这样。

select a, b, c, dfrom tableA ainner join tableB bon a.Id = b.IDwhere a.value < .99order by a.Id

看到问题了吗?

这就是你想要的

select a, b, c, d from table A a inner join table B b on a.Id = b.ID where a.value < .99 order by a.Id

【讨论】:

  • 在每行尾随双引号之前添加一个额外的空格,最后一个结果除外。
  • @chris 我不认为你用 bcp 作为前缀——错误消息来自 Windows 而不是来自 sql server。
  • 所有这些都是通过批处理文件调用的。当我将查询展平并删除额外的双引号和克拉时,它运行良好。我在问我是否/如何能够从单行创建一个“块”查询,以使这些更具可读性/可维护性。
  • @Chris 我不认为这是一个编程问题,我认为这是一个管理/应用程序问题。通常在superuser.com 上询问批处理和 shell 问题,而不是在这里。据我所知,使用多行的唯一方法是将其放在单独的 .sql 文件中并从命令行引用该文件。
【解决方案2】:

使用反斜杠 \ 似乎有效,至少在我使用 SSMS v17.1 进行的测试中

EXECUTE master.dbo.xp_cmdshell 
'bcp "\
select ''adam'', \
''kev'', \
''bill'', \
" queryout "\\network\path\file.txt" -t"|" -c -T ' 

【讨论】:

    猜你喜欢
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    相关资源
    最近更新 更多