AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 165429
Accepted
ChrisF
ChrisF
Asked: 2017-02-25 06:21:34 +0800 CST2017-02-25 06:21:34 +0800 CST 2017-02-25 06:21:34 +0800 CST

如何将超过 256 个字符输出到文件?

  • 772

我正在使用以下命令将存储过程的输出写入文件以进行进一步处理:

DECLARE @shellCommand VARCHAR(2000)
SET @shellCommand = 'SQLCMD -S ' + @@SERVERNAME + ' -d ' + @dbName + ' -U ' + @UserName + ' -P ' + @Password + ' -Q "' + @sqlCommand + '" -s "," -h -1 -k 1 -W -o "' + @outputfileName + '"'

@sqlCommand正确设置为“EXEC StoredProcedureName parameterValue”,并且在独立运行时显然会产生正确的数据。

我遇到的问题是其中一个字段包含长度超过 256 个字符的文本,并且在通过 SQLCMD 命令输入时被截断。

在阅读文档时,我看到默认列宽是 256 个字符。所以我正在考虑使用-yor-Y选项来允许输出超过 256 个字符。-W但是,这些选项与我用来从输出中删除尾随空格的选项不兼容。我开始使用-y 0(尽管有性能警告 - 一旦我得到输出工作,我可以查看性能)。然而,这会产生一些奇怪的结果。

该文件由一个标题行和后面的数据行组成,应该如下所示:

First,ABC,Number,String,ReallyLongString,...
A,0123,14.99,"Short string","Longish string",...
B,0456,23.99,"Normal string","Really, really long string that's causing problems",...

使用该-W选项,文件格式正确,但很长的字符串被截断。我们发现它的原因是因为"缺少尾随并且文件没有被正确读取。

随着-y 0非常长的字符串得到输出,但大量空格被添加到明显随机的列中。我们得到这样的东西:

First,ABC ,Number    [...]      ,String,ReallyLongString,...
A    ,0123,14.99     [...]      ,"Short string","Longish string",...
B    ,0456,23.99     [...]      ,"Normal string","Really, really long string that's causing problems",...

(“数字”和由“[...]”表示的下一列之间还有很多很多的空格,我只是展示了一些)。

还有更多的数值必须以类似的方式进行格式化,而且似乎正是这些数值导致了值之后和下一个逗号之前的额外空格。我们可以忍受一些额外的空间,但不能像这样多,因为结果文件太大而无法被目标程序读取。

数据由如下所示的存储过程生成:

SELECT
    'First' AS First,
    'ABC' AS ABC,
    'Number' AS Number,
    'String' AS String,
    'ReallyLongString' AS ReallyLongString,
    ...

UNION ALL

SELECT
    'A' as First,
    Column1 as ABC,
    REPLACE(FORMAT(Column2, 'N2', 'en-GB'), ',', '') as Number, -- to get the format correct
    '"' + Column3 + '"' as String,
    '"' + Column4 + '"' as ReallyLongString,
    ....
FROM Table
WHERE <condition>

我认为问题是存储过程的输出。由于输出了额外的尾随空格,我只向-WSQLCMD 添加了该选项,但是查看存储过程我无法确定它们的来源。我将数字格式更改为包括RTRIM:

RTRIM(REPLACE(FORMAT(Column2, 'N2', 'en-GB'), ',', ''))

但这似乎没有什么区别。

我可以对存储过程做些什么,或者是否有 SQLCMD 的选项组合可以产生所需的输出?还是我必须找到其他方法来生成这个文件?

sql-server csv
  • 3 3 个回答
  • 7454 Views

3 个回答

  • Voted
  1. Best Answer
    ChrisF
    2017-03-08T02:53:08+08:002017-03-08T02:53:08+08:00

    在尝试评论中的各种建议时,我偶然发现了一个解决方案。

    我更换了:

    '"' + Column4 + '"' as ReallyLongString,
    

    和:

    '"' + REPLICATE('O', 4000) + '"' AS ReallyLongString,
    

    并且所有的文本都被输出了。

    但是,使用变量:

    DECLARE @longText NVARCHAR(MAX)
    SET @longText = REPLICATE('O', 4000);
    
    '"' + @longText + '"' AS ReallyLongString,
    

    没有。

    起作用的是声明具有特定长度的变量:

    DECLARE @longText NVARCHAR(4000)
    

    因此,由于这种情况下的文本永远不会超过 2000 个字符(读取文件的设备无法处理那么长的文本),我将所有文本转换为 2000 个字符长的字符串:

    SELECT
        'A' as First,
        Column1 as ABC,
        REPLACE(FORMAT(Column2, 'N2', 'en-GB'), ',', '') as Number, -- to get the format correct
        '"' + CAST(Column3 as NVARCHAR(2000)) + '"' as String,
        '"' + CAST(Column4 as NVARCHAR(2000)) + '"' as ReallyLongString,
        ....
    FROM Table
    WHERE <condition>
    

    这就是方法。我仍然不知道为什么。

    • 2
  2. Marco Roy
    2019-03-27T18:03:30+08:002019-03-27T18:03:30+08:00

    奇怪... using-y 0实际上对我来说非常有效。没有空白填充或任何其他格式问题。它实际上比 更好-W,即使文档没有解释原因并且仍然建议使用-W:

    -W

    此选项从列中删除尾随空格。准备要导出到另一个应用程序的数据时,将此选项与 -s 选项一起使用。不能与 -y 或 -Y 选项一起使用。

    虽然它根本没有记录,但它似乎-y 0实际上做了-W广告,以及更多(无限的字符串长度,它甚至负责删除标题,所以不需要-h-1)。我必须使用的唯一其他选项是-s ","指定不同的列分隔符。

    我13.1.0007.0在 Linux 上使用版本,所以也许 OP 的问题是在更高版本中修复的问题。

    我遇到的唯一问题是在很长的字符串(超过 10 万个字符)的末尾添加了一个不可打印的字符(看起来像盒子的东西),但是当字符串被引用 ( '"' + field + '"') 时,该字符就消失了。¯\_(ツ)_/¯

    • 1
  3. Code First
    2020-03-06T08:27:33+08:002020-03-06T08:27:33+08:00

    在此处输入图像描述

    在 SSMS 选项中,将Query Results > Restuls 更改为 Text > 每列中显示的最大字符数:

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve