SQL视图中的双列

| 我们有一个旧接口,将旧接口插入表T1中,值values0ѭ,
\"BODY_BIN\"(varbinarymax)
。 当前,它仅插入到其中一列,而另一列为NULL。 现在,我们实现了一个新接口-表T2仅具有
\"BODY\"(varbinarymax)
列。 我需要创建一个视图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
vs. 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是二进制或文本的,但不能同时是两者。新接口的表T2仅具有一列BODY(varbinarymax),我被要求删除表T1并创建一个具有相同名称的视图。意味着为了保持向后的可比性,它们仍应能够执行“插入T1值X,Y \”(X为DATA_BIN或NULL,Y为DATA_TEXT或NULL),但是内容(取自X或Y) )应该转换为T2表中的ONE栏-BODY。 我不知道如何提出这一点。 你能帮助我吗? 谢谢, 妮莉     
已邀请:
varbinary到varchar(注意顺序)将隐式转换。所以这行得通,因为ISNULL采用第一个数据类型
ISNULL(varchar, varbinary)
COALESCE失败,因为它采用了最高优先级的数据类型(varbinary)。不允许隐式强制转换。
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:类似这样的东西(未经测试)保持相同的写接口。通常,我只会维护一个读取接口,因此会造成混乱。
CREATE VIEW OldFoo
AS
SELECT
    ID,
    BODY AS BODY_BIN,
    CAST(BODY AS varchar(MAX)) AS BOY_TEXT
FROM
    newFoo
GO
CREATE TRIGGER ON OldFoo INSTEAD OF INSERT
AS
SET NOCOUNT ON
INSERT newFoo (BODY)
SELECT ISNULL(binmax, CONVERT(varbinary(MAX), charmax))
FROM INSERTED
GO
    
首先,这是一个糟糕的设计。在
varchar(max)
varbinary(max)
字段中加入字段是一个坏主意,因为它们无法被索引。准备表扫描! 同一列中的数据类型不一致,这是一个问题。 尝试:
CAST((COALESCE(BODY_BIN, BODY_TEXT)) as varchar(max))
    

要回复问题请先登录注册