2009-08-18 28 views
0

我正在使用Microsoft SQL Server 2008環境中的2個通過GUID連接的相關表。在一個表中,該字段的類型爲varchar(50),另一個類型的類型爲uniqueidentifier。這顯然很糟糕,但現在我無法改變它,因爲它是由傳統軟件提供的。持久計算列中的類型轉換

SQL Server需要在每個內部連接執行的轉換使查詢運行非常緩慢,因爲我根本無法使用索引。我嘗試添加一個持續存在的計算列,以便將ID存儲爲uniqueidentifer。這樣我可以添加一個索引來讓它運行得更快。我失敗了。

有誰知道我是否可以將明確轉換的值存儲在計算機列中。如果可以,在這裏使用什麼公式?

乾杯, 馬蒂亞斯

回答

3

這爲我工作:

CREATE TABLE t_uuid (charid VARCHAR(50) NOT NULL, uuid AS CAST(charid AS UNIQUEIDENTIFIER)) 

CREATE INDEX IX_uuid_uuid ON t_uuid (uuid) 

INSERT 
INTO t_uuid (charid) 
VALUES (NEWID()) 

SELECT * 
FROM t_uuid 
+0

謝謝,效果很好。查詢需要4秒而不是半小時。 :) – 2009-08-18 14:51:32

1

CONVERT(唯一標識符,your_varchar_here)

+0

工作正常。 Management Studio說'錯誤驗證列'MyColumn'的公式',但仍保存更改並且工作正常。奇怪... – 2009-08-18 14:50:32

1

根據您需要多長時間進行轉換的加盟,我會使用CTE來轉換數據類型。它的構建速度比內聯視圖(次臨時選項)要快。無論哪種情況,您都會在CTE /內嵌視圖的結果列中將值作爲正確的數據類型公開,以便您可以加入它。 CTE例子:

WITH example AS (
    SELECT t.guid 
      CONVERT(UniqueIdentifier, t.guid) 'cguid' 
    FROM TABLE t) 
SELECT t.* 
    FROM TABLE t 
    JOIN example e ON e.cguid = t.guid 

內嵌視圖例如:

SELECT t.* 
    FROM TABLE t 
    JOIN (SELECT t.guid 
       CONVERT(UniqueIdentifier, t.guid) 'cguid' 
      FROM TABLE t) e ON e.cguid = t.guid 

它不會得到解決,對於GUID指數(假設一樣)將不被使用,但它也並不是一個好習慣要在WHERE子句中執行數據類型轉換。