Как указать столбцы как NOT NULL в представлении?
Вопрос
Я пытаюсь использовать представление для создания объекта ADO.NET с помощью представления.Однако в этом представлении нет ни одного столбца, который НЕ равен NULL.
Мне пришло в голову создать столбец NOT NULL в представлении, который будет использоваться в качестве «первичного ключа» для представления.Это сработало, но поле по-прежнему имеет значение NULL.
Есть ли способ заставить или обмануть SQL Server, чтобы он сообщал об этом столбце представления как NOT NULL?
Представьте себе, что это представление выглядит примерно так:
CREATE VIEW vwSample WITH SCHEMABINDING
AS
SELECT ID = convert(uniqueidentifier, /* some computed value */)
,Field1
,Field2
,Field3
FROM tbSample
Примечание: Прежде чем сказать, что я могу редактировать XML-объект для таких целей, я спрашиваю об этом, потому что у меня есть ОЧЕНЬ таким образом будет создано большое количество объектов.
Решение
Я не знаю, стоит ли это усилий, но я думаю, что создание функции, возвращающей временную таблицу с полями NOT NULL, должно работать для вычисленного значения.бывший.
Create function fnSTestample()
returns @Test TABLE
(
tableId varchar(100) not null
)
WITH SCHEMABINDING
as
begin
insert @Test(tableID)
select 'some computed value' from dbo.someTable
return
end
а затем вы выбираете эту функцию в представлении.
Ваше здоровье.
Другие советы
Во-первых, чтобы ответить на ваш вопрос:
Вы не хотите использовать newid()
чтобы определить поле вашего идентификатора, поскольку оно будет пересчитываться каждый раз, когда вы используете представление.Действительно, целостность данных — самая большая проблема.
select
row_number() over (order by someStaticAndUniqueFieldLikeCreateDate) as ID,
Field1,
Field2,
Field3
from
tblA
order by
someStaticAndUniqueFieldLikeCreateDate
Это работает только в том случае, если вы упорядочиваете поле, которое будет иметь последовательный порядок, в котором будут добавляться новые строки, например CreateDate
поле.Если у вас его нет, этот идентификатор может быть изменен.Теперь, если вам нужны эти идентификаторы только во время выполнения и нет ничего, что могло бы с ними постоянно связываться, row_number
будет просто потрясающе.Если у вас ненадежные данные, невозможно создать надежное поле идентификатора. пока не вы создаете дополнительную таблицу и используете триггеры для ее заполнения.
Во-вторых, будьте с этим осторожны with schemabinding
.Это опасно, если использовать его как кладж.Помните, что как только вы создадите представление with schemabinding
, вы не можете изменить схему любой базовая таблица совсем.Это означает, что вы не можете сделать varchar(50)
столбец а varchar(100)
без удаления и повторного добавления всех представлений, которые with schemabinding
включено.Да, вы можете индексировать представление, привязанное к схеме, но определенно есть компромиссы, которые необходимо принять во внимание, прежде чем приступить к делу.
я использовал ISNULL
для этого.Т.е.у меня сработало что-то вроде следующего:
CREATE VIEW vwSample WITH SCHEMABINDING
AS
SELECT ID = ISNULL(uniqueidentifier, /*some computed value */)
,Field1
,Field2
,Field3
FROM tbSample
Использовать новыйид()
CREATE VIEW vwSample WITH SCHEMABINDING
AS
SELECT ID = NEWID()
,Field1
,Field2
,Field3
FROM tbSample