【问题标题】:SSMS :: Copy with Headers and paste to Excel results in more rows in destinationSSMS :: 使用标题复制并粘贴到 Excel 会导致目标中的行更多
【发布时间】:2021-05-28 11:36:06
【问题描述】:

特殊问题:我有一个包含 140.588 行和 246,313 MB 的表,如下所示:

CREATE TABLE [dbo].[DMA_assessment](
    [InstanceName] [varchar](128) NULL,
    [DatabaseName] [varchar](128) NULL,
    [SizeMB] [varchar](30) NULL,
    [ImpactedObjectName] [varchar](128) NULL,
    [ImpactDetail] [varchar](max) NULL,
    [AssessmentName] [varchar](128) NULL,
    [AssessmentNumber] [int] NULL,
    [SourceCompatibilityLevel] [varchar](15) NULL,
    [TargetCompatibilityLevel] [varchar](15) NULL,
    [TargetSQLServerEdition] [varchar](15) NULL,
    [Category] [varchar](50) NULL,
    [Severity] [varchar](15) NULL,
    [ChangeCategory] [varchar](30) NULL,
    [Title] [varchar](500) NULL,
    [Impact] [varchar](max) NULL,
    [Recommendation] [varchar](max) NULL,
    [MoreInfo] [varchar](max) NULL,
    [ObjectType] [varchar](40) NULL,
    [DBOwnerKey] [int] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

点击放大。

此表由DMA Tool 创建,我想使用输出来可视化 Power BI 上的结果。查询这么大的表是不可能的。我需要将其导出为 .csv 或 .xlsx 文件

如果我执行臭名昭著的右键单击并“使用标题复制”,然后将其粘贴到 Excel 文件中,则结果为 141186 行(-1,因为第一行是列名)

(再次点击查看详情)

所以我们来了:

141186 - 140558 = 598

它们来自那 598 行?

我试了多次,结果还是一样。

【问题讨论】:

  • 是否会有任何行包含换行符?过滤第一列的空白。一般来说,从 SSMS 复制粘贴并不是一种非常可靠的行传输方式。 SSMS 有一个导入/导出向导,可以将任何查询的结果推送到支持的目的地,包括 CSV 和 Excel(尽管后者可能只是具有 65K 行限制的旧式 Excel,我不确定)。不过,如果您打算在 PBI 中获得结果,我不太明白为什么有必要这样做——您说查询是“不可能的”,但您是自己做的。还不如跳过中间人。
  • 您的数据可能有一些换行符或一些混淆复制和粘贴的东西。就个人而言,我建议您不要依赖 SSMS 来复制和粘贴数据,除了最简单的数据。如果要从 SQL Server 中提取数据,请使用不同的方法或工具。

标签: sql-server excel ssms export-to-excel


【解决方案1】:

我猜你的varchar(max) 会导致问题。 Excel 中文本字段的大小是有限的。举个例子:

DECLARE @x VARCHAR(MAX) = '***************************************************************************';
SELECT @x=CONCAT(@x,@x)
SELECT @x=CONCAT(@x,@x)
SELECT @x=CONCAT(@x,@x)
SELECT @x=CONCAT(@x,@x)
SELECT @x=CONCAT(@x,@x)
SELECT @x=CONCAT(@x,@x)
SELECT @x=CONCAT(@x,@x)
SELECT @x=CONCAT(@x,@x)
SELECT @x=CONCAT(@x,@x)
SELECT @x=CONCAT(@x,@x)
SELECT @x=CONCAT(@x,@x)
SELECT @x=CONCAT(@x,@x)

SELECT @x AS Test, 'Test' AS Test2

将结果复制到 excel 文件中,您将得到两行,其中第二列 (Test2) 仅在第二行中显示。

【讨论】:

  • 谢谢@Tyron78,我将所有varchar(max) 更改为varchar(128),但现在当我粘贴时我有2.704.123 行。那我该怎么办?
  • 不管怎样,你的回复很好。我不得不删除列,就是这样。这有点残酷,但我找不到任何其他解决方案。即使将列设置为varchar(50),问题仍然存在
  • 你在哪里改变了数据类型?直接在提到的表中?您是否对 varchar(max) 值执行了子字符串?
  • 不,我通过设计器粗暴地更改了数据类型。它截断了整行中的值。
【解决方案2】:

您可以尝试在 excel 中使用 .dqy 查询。

我开发了 SSMSBoost 插件,我们在文章中对此进行了介绍(您可以直接在 Excel 中创建 .dqy 查询,无需我们的插件): https://www.ssmsboost.com/Features/ssms-add-in-run-query-in-excel

还有一个视频,它解释了将数据导出到 Excel 中而不会丢失数据的 3 种不同方法(保留数据类型信息): (以原生 excel 格式复制粘贴、XML 导出、.dqy 查询) https://youtu.be/waDCukeXeLU

【讨论】:

  • Copying failed. Exception of type 'System.OutOfMemoryException' was thrown.。我正在复制/粘贴 223.896 行
  • 我相信有一个错误:1)导出到 .xml 文件 2)用 Excel 打开 .xml 文件 3)在每个标题上放置一个下拉过滤器 4)过滤一个标题(在我的如果它是 NULL 值)5)您现在列出了该列中包含该 NULL 值的所有行 6)再次按下下拉菜单,只有 NULL 选项
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 2021-01-15
  • 2020-07-15
  • 2021-11-27
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
相关资源
最近更新 更多