Двойные столбцы в представлении SQL - PullRequest
0 голосов
/ 24 мая 2011

У нас есть устаревший интерфейс, который вставляет в таблицу T1 значения "BODY_TEXT" (varcharmax), "BODY_BIN"(varbinarymax).В настоящее время он вставляется только в один из столбцов, а другой остается пустым.Теперь мы реализовали новый интерфейс - таблицу 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 против 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.Пользователь вставил одно значение, а другое оставил ноль, поскольку тело является двоичным или текстовым, но не обоими.В новом интерфейсе есть таблица T2, в которой есть только один столбец BODY (varbinarymax), и меня попросили удалить таблицу T1 и создать представление с тем же именем.Это означает, что для сохранения обратной сопоставимости они по-прежнему должны иметь возможность «вставлять в значения T1 X, Y» (X - DATA_BIN или NULL, а Y - DATA_TEXT или NULL), но содержимое (взятое из X или Y) должноперевести в ОДИН столбец в таблице T2 - ТЕЛО.Понятия не имею, как его подтянуть.

Можете ли вы мне помочь?

Спасибо,

Нили

Ответы [ 2 ]

2 голосов
/ 24 мая 2011

varbinary to 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
1 голос
/ 24 мая 2011

Во-первых, это плохой дизайн. Присоединение к полям varchar(max) или varbinary(max) - плохая идея, поскольку они не могут быть проиндексированы. Приготовьтесь к сканированию таблицы!

В одном столбце есть несовместимые типы данных, что является проблемой.

Попробуйте:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...