如何在SQL Server 2016中创建宽表?

时间:2017-02-21 13:48:49

标签: sql sql-server tsql

使用此代码(*),在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.

USE [Style] GO

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)

寻找好的提示!

Background of why I need a wide table

以下是我要导入宽表

的背景数据集

4 个答案:

答案 0 :(得分:3)

此解决方案是规范您的设计。即使你可以适应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的日期和金额。您仍然可以根据需要将日期转换为上面提供的格式。将日期作为列中的值使您可以更灵活地使用数据,获得更好的性能,并自然地处理更多日期。

答案 1 :(得分:2)

将其标准化,允许将查询作为查询的一部分:

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

答案 2 :(得分:1)

使用三列创建表:ID,Date,Amount。每个ID在表格中都有多行(对于每个日期,其中有一个金额值)。

答案 3 :(得分:0)

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字节。因此,您的大多数列都没有数据。

所以 - 问题在于你的设计。看起来,几个月应该是行,而不是列。或者更好的是表格的其他结构。如果没有在应用程序中看到数据结构,就无法猜到。