如何在SQL server 2016中创建宽表?
使用此代码(*),在SQL中创建宽表会让我不断发送以下内容:如何在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
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
)
);