2011-05-24 31 views
0

我們有一個傳統界面,插入到表T1中,值爲"BODY_TEXT" (varcharmax),"BODY_BIN"(varbinarymax)。 它目前僅插入到其中一列,並將另一列留空。 現在我們實現了一個新的界面 - 只有"BODY"(varbinarymax)列的表T2。SQL視圖中的雙列

我需要創建一個視圖V1應該取代T1,意味着

CREATE VIEW V1 AS 
SELECT 
T2.UNIQUE_ID AS UNIQUE_ID, 

等等

現在我不知道如何對待T2.BODY列...我需要做的是這樣 T2.BODY AS (whatever is not null(BODY_BIN, BODY_TEXT)) 。它還必須支持varcharmax與varbinarymax。 我試過執行COALESCE,意思是T2.BODY AS COALESCE(BODY_BIN, BODY_TEXT),但它不起作用。 也不

COALESCE(BODY_BIN, BODY_TEXT) AS BODY 
T2.BODY AS BODY 

再次 - 在傳統表中,我們有T1有兩列 - BODY_BIN和BODY_TEXT。用戶插入一個值並將另一個值留空,因爲body是二進制或文本,但不是兩者。新接口有一個只有一列BODY(varbinarymax)的表T2,我被要求刪除表T1並創建一個同名的視圖。爲了保持向後的可比性,他們應該仍然能夠執行「插入到T1值X,Y」(X是DATA_BIN或NULL,Y是DATA_TEXT或NULL),但是內容(取自X或Y)應該被翻譯成T2表中的ONE列 - BODY。 我不知道如何拉這個。

你能幫我嗎?

感謝,

尼莉

+0

我不知道我理解。 COALESCE()應該有效。 – 2011-05-24 10:06:32

+0

是的,但請注意方向是不同的 - 通常你「地圖」表來查看,意思COALESCE(DATA_BIN,DATA_TEXT)作爲T.BODY,但我需要映射從視圖的最大值,這意味着T2.BODY AS COALESCE DATA_BIN,DATA_TEXT)或類似的東西... – Nili 2011-05-24 11:19:57

+0

我是否正確讀取這個:你想要改變列名取決於哪個數據類型被返回? No Tobias。 – tobias86 2011-05-24 11:20:14

回答

1

首先,這是一個不好的設計。加入varchar(max)varbinary(max)字段是一個壞主意,因爲它們無法編入索引。準備桌面掃描!

您在同一列中有不一致的數據類型,這是一個問題。

嘗試:

CAST((COALESCE(BODY_BIN, BODY_TEXT)) as varchar(max))

+0

但我需要將T2值映射到非空值,這意味着我需要類似於:T2.Body AS CAST((COALESCE(BODY_BIN,BODY_TEXT))as varchar(max)),但它不起作用。 。 – Nili 2011-05-24 11:15:29

+0

@Nili:'COALESCE(CAST(BODY_BIN AS varchar(max)),BODY_TEXT))'? – 2011-05-24 12:07:54

2

VARBINARY爲varchar(注意順序)將隱式轉換。所以這個工作,因爲ISNULL採用第一個數據類型,因爲它需要最高優先級的數據類型(這是VARBINARY)

ISNULL(varchar, varbinary) 

COALESCE失敗。隱式轉換不允許。 ISNULL(varbinary, varchar)會失敗太

你需要一個明確的CAST

DECLARE @foo TABLE (ID int IDENTITY (1,1), charmax varchar(MAX) NULL, binmax varbinary(MAX) NULL) 

INSERT @foo (charmax, binmax) VALUES ('text', NULL) 
INSERT @foo (charmax, binmax) VALUES (NULL, 0x303131) 
INSERT @foo (charmax, binmax) VALUES ('Moretext', NULL) 
INSERT @foo (charmax, binmax) VALUES (NULL, 0x414243454647) 

SELECT ISNULL(binmax, CONVERT(varbinary(MAX), charmax)) 
FROM @foo 

SELECT COALESCE(binmax, CONVERT(varbinary(MAX), charmax)) 
FROM @foo 

編輯:我現在明白了問題...也許

DECLARE @foo2 TABLE (ID int IDENTITY (1,1), BODY varbinary(MAX) NULL) 

INSERT @foo2 (BODY) VALUES (CAST('text' AS varbinary(MAX))) 
INSERT @foo2 (BODY) VALUES (0x303132) 
INSERT @foo2 (BODY) VALUES (CAST('Moretext' AS varbinary(MAX))) 
INSERT @foo2 (BODY) VALUES (0x414243454647) 
SELECT 
    BODY AS BODY_BIN, 
    CAST(BODY AS varchar(MAX)) AS BOY_TEXT 
FROM 
    @foo2 

EDIT2:是這樣的(測試),以保持相同的寫入接口。通常情況下,我只能保持一個讀取接口,因此混亂...

+0

我仍然不知道如果一個簡單的演員會工作,我仍然落後一步,因爲我不知道如何將表T2中的一個「物理」列綁定到非空值的二 - 從V1列... – Nili 2011-05-24 11:42:58

+0

@Nili:我已經給你證明它*的*工作在我的腳本上面 – gbn 2011-05-24 11:43:48

+0

好的謝謝,但我怎麼把它從T2.BODY綁定到V1 ...? – Nili 2011-05-24 11:46:09