2017-05-19 54 views
0

我有一個表,DD,這是一個數據字典,與字段(比方說):是否有可能在SQL Server中根據另一個字段的內容來轉換字段的類型?

ColumnID (longint PK), ColumnName (varchar), Datatype (varchar) 

我有另一個表,V,其中我的記錄集的形式:

ColumnID (longint FK), ColumnValue (varchar) 

我希望能夠將來自V的記錄集合轉換爲另一個表結果,其中每個字段將基於DD.Datatype的進行轉換,以便目標表可能是(比如說):

ColumnID (longint FK), ColumnValue (datetime) 

爲了能夠做到這一點,ISTM,我需要能夠做到像

CONVERT(value of DD.Datatype, V.ColumnValue) 

誰能給我這是否是甚至有可能,如果是這樣的語法會是什麼任何線索?我的谷歌已經證明不足以找到任何相關的東西

+1

任何*特定*查詢總是會生成具有固定「形狀」的結果集 - 列數,它們的名稱和它們的*類型*。你當然不能在你的問題中隱含什麼 - 一個結果集,可能每個*行*都有一個包含不同類型值的列。 –

+0

是的,我明白了。我要做的是在子表中創建一個父表和一組記錄的非標準化視圖。 因此,使用我原來的名字,我會在父表中有一條記錄,並且在* V *中有多條記錄,這些記錄是該父代的屬性;我的輸出將是一個表格*結果*其中包含來自* V *中每個記錄的父*和* 1字段的字段,這是父記錄的子元素 – khafka

+0

也許如果您可以提供有關源數據和所需輸出的詳細信息我們可以幫助。這裏是一個開始的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

回答

1

你可以用動態sql做這樣的事情,當然。只要您意識到數據類型是結果集中COLUMN的屬性而不是結果集中每個單元格的限制。所以給定列中的所有行必須具有相同的數據類型。

0

在SQL中完成類似CONVERT(value of DD.Datatype, V.ColumnValue)的唯一方法是使用動態SQL。這有它自己的問題,比如基本上需要使用存儲過程來保持查詢效率。或者,您可以使用一個查詢獲取數據類型元數據,在應用程序中構造一個新的查詢,然後再次查詢數據庫。你使用SQL Server 2012+假設,你也可以嘗試使用TRY_CAST()TRY_CONVERT(),寫你的查詢,如:

SELECT TRY_CAST(value as VARCHAR(2)) FieldName 
FROM table 
WHERE datatype = 'VARCHAR' AND datalength = 2 

但同樣,你要知道有效的類型是什麼;您無法動態確定與SQL沒有動態SQL。變量和參數不允許用於對象或類型名稱。但是,無論您做什麼,都需要記住結果集的給定列中的所有數據必須具有相同的數據類型

大多數Entity-Attribute-Value tables像這樣犧牲了數據的完整性,強大的打字帶來了接受數據類型是由應用程序而不是RDBMS決定的。 EAV不允許你擁有你的蛋糕(存儲沒有固定模式的數據)並且也可以使用它(享受數據庫強制的強數據輸入,不必在應用程序中輸入字符串等)。

EAV相當不好地破壞了數據標準化。它打破了第一範式;最基本的規則,這只是其中的一個後果。 EAV表格可以查詢數據從尷尬到非常困難的任何地方,並且幾乎總是會犧牲性能,因爲RDBMS是圍繞關係模型構建的。

這並不意味着你不應該使用EAV表。它們對於用戶定義的字段相對較好。但是,這確實意味着他們總是會吮吸查詢和管理。這只是權衡。你打破了第一範式。查詢和績效將會受到這種選擇的影響。

如果你真的想保存你這樣的所有你的數據,你應該看看無論是存儲數據的XML或JSON(SQL服務器2016)的斑點 - 但那是查詢一般的疼痛 - 或使用像MongoDB或Cassandra這樣的NoSQL數據存儲,而不是SQL RDBMS。

+0

感謝@Bacon位,這給了我幾件事情要進一步思考 - 特別是它是否會最好將數據存儲爲XML或JSON,而不是將數據存儲在子表中,因爲我可以看到XML/JSON方法的明顯優勢。 查詢性能可能是也可能不是問題,這是我需要仔細考慮的問題 - 從某種意義上說,我正在構建一個大型數據轉儲,可能需要進行特定轉換才能對客戶端應用程序有用,作爲其一部分設計;另一方面,使數據直接可用在大多數情況下顯然會更好 – khafka

相關問題