2011-05-24 33 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