首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL视图中的双倍列

SQL视图中的双倍列
EN

Stack Overflow用户
提问于 2011-05-24 17:39:18
回答 2查看 256关注 0票数 0

我们有一个遗留接口,它插入到值为"BODY_TEXT" (varcharmax)"BODY_BIN"(varbinarymax)的表T1中。它当前只插入其中一列,并将另一列保留为空。现在我们实现了一个新的接口表T2,它只有"BODY"(varbinarymax)列。

我需要创建一个应该替换T1的视图V1,这意味着

代码语言:javascript
复制
CREATE VIEW V1 AS
SELECT 
T2.UNIQUE_ID AS UNIQUE_ID,

etc…

现在我不知道如何对待T2.BODY列…我需要做一些像T2.BODY AS (whatever is not null(BODY_BIN, BODY_TEXT))这样的事情。它还必须支持varcharmax与varbinarymax。我尝试实现了COALESCE,也就是T2.BODY AS COALESCE(BODY_BIN, BODY_TEXT),但它不起作用。也不会

代码语言:javascript
复制
COALESCE(BODY_BIN, BODY_TEXT) AS BODY
T2.BODY AS BODY

同样-在旧表中,我们有包含两列的T1 - BODY_BIN和BODY_TEXT。用户插入了一个值,而另一个值为空,因为body要么是二进制的,要么是文本的,而不是两者都是。新接口有一个表T2,它只有一列BODY (varbinarymax),我被要求删除表T1并创建一个同名视图。这意味着为了保持向后的可比性,它们应该仍然能够执行"insert to T1 values X,Y“(X是DATA_BIN或NULL,Y是DATA_TEXT或NULL),但内容(取自X或Y)应该转换为T2表体中的一列。我不知道怎么把这个拔出来。

你能帮帮我吗?

谢谢,

尼利

EN

回答 2

Stack Overflow用户

发布于 2011-05-24 19:30:00

varbinary到varchar (注意顺序)将隐式强制转换。所以这是可行的,因为ISNULL接受第一个数据类型

代码语言:javascript
复制
ISNULL(varchar, varbinary)

COALESCE失败,因为它采用最高优先级的数据类型(即varbinary)。不允许隐式强制转换。ISNULL(varbinary, varchar)也会失败

你需要一个明确的类型转换

代码语言:javascript
复制
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

代码语言:javascript
复制
SELECT COALESCE(binmax, CONVERT(varbinary(MAX), charmax))
FROM @foo

编辑:我现在明白这个问题了.也许吧

代码语言:javascript
复制
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:类似这样的东西(未经过测试),用于维护相同的写入接口。通常,我只会维护一个读接口,因此会产生混乱……

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2011-05-24 18:58:33

首先,这是一个糟糕的设计。连接varchar(max)varbinary(max)字段不是一个好主意,因为它们不能被索引。准备好表扫描!

在同一列中有不一致的数据类型,这是一个问题。

尝试:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6108480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档