2017-02-21 158 views
-4

有了這個代碼(*),在SQL寬表的創建讓我發送此:如何在SQL Server 2016中創建一個寬表?

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. 

使用[風格] 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

這裏是背景組數據我想導入到我的廣譜

+10

有一個日期作爲列名...看起來像你迷失了... – jarlh

+9

爲什麼地球上你會需要一個2614列的表?這是一個可怕的設計,你真的應該做一些正常化。 –

+0

我剛剛更新了一張圖片,所以你可以理解我在做什麼 –

回答

2

規範化它,允許columning作爲查詢的一部分:

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

創建包含三列的表格:ID,日期,金額。每個ID在表格中都有多行(每個日期都有一個數值)。

0

在SQL服務器中的列數限制:

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字節。所以,你的大多數專欄應該沒有數據。

所以 - 問題出在你的設計中。看起來像月,應該是行,而不是列。或者,也許更好的是一些其他的表格結構。如果沒有看到應用程序中的數據結構,就無法猜測它。

+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的日期和金額的表中。如果需要,您仍然可以將日期轉換爲上面提供的格式。將日期作爲列中的值提供給您更多的靈活性,使您更好地使用數據,獲得更好的性能,並自然處理更多日期。

+0

我有1315個ID(股票),無法爲每個表創建一個表 –

+1

@RobinhoHcp您不需要爲每個表創建一個表。製作一張適合所有數據的表格,並附加一列來標識每個存貨。 –

+0

@RobinhoHcp爲每個日期創建一個列與爲每個ID創建一個表一樣不切實際。你需要一個帶有_composite key_的表 - 也就是說,一個包含兩列的主鍵:ID和日期。該表中的每一行表示特定日期的特定ID。 – megaflop

相關問題