【问题标题】:How do I create a wide table in SQL server 2016?如何在 SQL Server 2016 中创建宽表?
【发布时间】:2017-02-21 13:48:49
【问题描述】:

使用此代码 (*),在 SQL 中创建宽表让我不断发送:

Msg 1702, Level 16, State 1, Line 11
CREATE TABLE failed because column '2010/12/01' in table 'PriceToBookFinalI' exceeds the maximum of 1024 columns.

使用 [样式] 去吧

CREATE TABLE [dbo].[PriceToBookFinalI]
    (DocID int PRIMARY KEY,
    [2006/12/29][Money],
    [2007/01/01][Money],
    ...
    SpecialPurposeColumns XML COLUMN_SET FOR ALL_SPARSE_COLUMNS);  

GO

(2614 columns)

寻找一个好的提示!

这是我要导入宽表的背景数据集

【问题讨论】:

  • 将日期作为列名...好像你迷路了...
  • 为什么你需要一个有 2614 列的表?这是一个糟糕的设计,你真的应该做一些规范化。
  • 我刚刚更新了一张图片,所以你可以理解我在经历什么
  • 如果你以前从未听说过规范化,我听说过《数据库设计》这本书的好东西/

标签: sql sql-server tsql


【解决方案1】:

解决方案是规范您的设计。即使您可以将其放入 1024 限制中,您的设计也不是一个好主意。例如,如果您想知道 DocID 每月更改的平均数量怎么办。在这个模型中写这将是一场噩梦。

试试这个吧。

CREATE TABLE dbo.PriceToBookFinalI (
                                     DocID INT PRIMARY KEY,
                                     SpecialPurposeColumns XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
                                   );


CREATE TABLE dbo.PriceToBookFinalMoney (
                                         DocID INT,
                                         DocDate DATE,
                                         DocAmount MONEY,
                                         CONSTRAINT PK_PriceToBookFinalMoney
                                           PRIMARY KEY CLUSTERED
                                           (
                                             DocID,
                                             DocDate
                                           )
                                       );

您可以轻松地将具有 SpecialPurposeColumns 的表加入到具有每个 DocID 的日期和金额的表中。如果需要,您仍然可以将日期转换为您在上面提供的格式。将日期作为列中的值可以让您更灵活地使用数据、提高性能并自然地处理更多日期。

【讨论】:

  • 我有 1315 个 ID(股票),不可能为每个人做一个表
  • @RobinhoHcp 您不需要为每个人制作一张桌子。制作一张适合所有数据的表格,并添加一列来标识每只股票。
  • @RobinhoHcp 为每个日期制作一列与为每个 ID 制作一个表格一样不切实际。您需要一个带有复合键 的表——即包含两列的主键:ID 和日期。该表中的每一行代表特定日期的特定 ID。
【解决方案2】:

规范化它,允许列作为查询的一部分:

Create table Price (DocID INT primary key,
                    DocRef Varchar(30), -- the values from your [DATES] column 
                    DocDate DATE,
                    DocValue MONEY);

【讨论】:

    【解决方案3】:

    创建包含三列的表:ID、日期、金额。每个 ID 都会在表格中有多行(每个日期都有一个金额值)。

    【讨论】:

      【解决方案4】:

      SQL Server 中存在列数限制:

      https://msdn.microsoft.com/en-us/library/ms143432.aspx

      Columns per nonwide table        1,024
      Columns per wide table          30,000
      

      您可以使用“宽表”,其中是稀疏列 - 列集。 https://msdn.microsoft.com/en-us/library/cc280521.aspx

      但是 - 表将有限制 - 每行 8,060 字节。因此,您的大多数列应该没有数据。

      所以 - 问题出在您的设计中。看起来,月份应该是行,而不是列。或者也许更好的是表格的其他结构。不看应用中的数据结构是猜不出来的。

      【讨论】:

      • 看我的代码...我用的是“宽表”定义
      猜你喜欢
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多