【问题标题】:sqlcmd - How to get around column length limit without empty spaces?sqlcmd - 如何绕过没有空格的列长度限制?
【发布时间】:2011-05-06 20:52:00
【问题描述】:

我正在尝试在运行 SQL Server 2005 的 Windows 机器上使用 sqlcmd 将查询写入 csv 文件。我们通常使用的命令行选项是:

-l 60 -t 300 -r 1 -b -W -h -1

但是,列被截断为 256 字节。为了避免这种情况,我尝试使用此命令行选项代替 -W:

-y 8000

这会捕获整个字段,但是这种方法的问题是由于所有额外的空间,文件从刚刚超过 1mb 膨胀到大约 200mb(我意识到 8000 可能是多余的,但它可能必须在至少 4000,我目前只处理一小部分数据)。 -W 选项通常会消除所有这些额外的空间,但是当我尝试将它们一起使用时,它告诉我它们是互斥的。

有没有办法让 sqlcmd 绕过这个限制,或者有谁知道其他程序(例如 bcp 或 osql)是否会使这更容易?


编辑: 这是我们用来获取被截断字段的代码 sn-ps(类似的代码用于一堆字段):

SELECT ALIASES.AliasList as complianceAliases,    

...

LEFT OUTER JOIN (Select M1.ID, M1.LIST_ID,stuff((SELECT '{|}' + isnull(Content2,'')+' '+isnull(Content3,'')+' '+isnull(Content4,'')+' '+isnull(Content5,'')+' '+isnull(Content6,'')+' '+isnull(Content7,'')
                                  FROM fs_HOST3_TEST_web.ISI_APP_COMP_MULTI M2 with (nolock)
                                  WHERE M1.LIST_ID = M2.LIST_ID and M1.ID = M2.ID and M1.TYPE = M2.TYPE                                      
                                  FOR XML PATH('')
                                  ),1,1,'') as AliasList
             FROM fs_HOST3_TEST_web.ISI_APP_COMP_MULTI M1 with (nolock)
             WHERE M1.LIST_ID = 2001 AND M1.TYPE = 'Aliases'
             GROUP BY m1.list_id,m1.ID,m1.Type) as ALIASES
             ON ALIASES.LIST_ID = PAIR.COMP_LIST_ID AND ALIASES.ID = PAIR.COMP_ID

【问题讨论】:

  • 请问截断的数据是什么数据类型?
  • 我们使用 stuff 函数和 FOR XML PATH 命令的组合将多个 nvarchar(500) 字段连接成一个字段。我不太确定它们究竟是如何工作的(我们通过谷歌找到了解决方案),但我们最终将它们都放在同一个领域,我们通过一个 select 语句将它们拉出来。我将编辑答案并包含代码。

标签: sql sql-server sqlcmd batch-file


【解决方案1】:

我最终通过使用“-y0”参数解决了这个问题。它仍然留下了一堆空白,但看起来它只去了每个字段中最长的数据的末尾。

然后我通过一个删除重复空格并解决所有问题的程序运行输出。

【讨论】:

  • 使用-y0 确实是最好的选择,谢谢!请注意,它与-h 不兼容,尽管它似乎也从SQMCMD 输出中删除了标题。
猜你喜欢
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 2014-04-11
  • 2019-03-14
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
相关资源
最近更新 更多