Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL server 2016中创建宽表?_Sql_Sql Server_Tsql - Fatal编程技术网

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

如何在SQL server 2016中创建宽表?,sql,sql-server,tsql,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. 使用[样式] 去 寻找一个好的提示 下面是我要导入到我的宽表的背景数据集将其正常化,允许将列作为查询的一部分: Create tab

使用此代码(*),在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 Price (DocID INT primary key,
                    DocRef Varchar(30), -- the values from your [DATES] column 
                    DocDate DATE,
                    DocValue MONEY);

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

SQL server中有一个列计数限制:

您可以使用“宽表”,其中是稀疏列-列集

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


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

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

将日期作为列名。。。好像你迷路了…你到底为什么需要一个有2614列的表格?这是一个糟糕的设计,你真的应该做一些规范化。我刚刚更新了一张图片,这样你就可以了解我在经历什么。如果你以前从未听说过规范化,我听说过这本书的好东西,为普通人设计数据库/看看我的代码。。。我使用了“宽桌子”的定义,我有1315个ID(股票),这是不可能的each@RobinhoHcp你不需要为每个人都做一张桌子。制作一个适合所有数据的表,并添加一列来标识每个股票。@Robinhohp为每个日期制作一列与为每个ID制作一个表一样不切实际。您需要一个带有复合键的表,即包含两列的主键:ID和日期。该表中的每一行表示特定日期的特定ID。
Columns per nonwide table        1,024
Columns per wide table          30,000
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
                                           )
                                       );