Как указать столбцы как NOT NULL в представлении?

StackOverflow https://stackoverflow.com/questions/1281826

  •  16-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь использовать представление для создания объекта 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top