16

为了强制执行更严格的类型安全并更容易检测错误,我想明确指定我的视图的列类型。

但是,虽然这有效:

CREATE VIEW [dbo].[myview] (
    [a],
    [b],
    [c]
)
AS
SELECT 'a1', 'b1', 'c1';

这失败了:

CREATE VIEW [dbo].[myview] (
    [a] nvarchar(32) NOT NULL,
    [b] nvarchar(32) NOT NULL,
    [c] nvarchar(32) NOT NULL
)
AS
SELECT 'a1', 'b1', 'c1';

这有正确的语法吗?

4

1 回答 1

26

SQL Server 必须推断类型 - 但如果需要,您可以强制执行:

CREATE VIEW [dbo].[myview] (
    [a],
    [b],
    [c]
)
AS
SELECT
   CONVERT(nvarchar(32),'a1'),
   CONVERT(nvarchar(32),'b1'),
   CONVERT(nvarchar(32),'c1');

至于事物的 null/non-null 方面,SQL Server 必须再次推断这一点。如果你有一个你知道的列,not null但 SQL Server 得到它不正确,你可以将它包装在一个ISNULL带有非空第二个参数的语句中:

SELECT ISNULL(ColumnSQLServerThinksCanBeNull,'abc')

然后它将将该列描述为not null。第二个值无关紧要(毕竟,这是关于我自己的断言,即该列永远不会为空),只要它与该列的类型兼容。

于 2012-12-14T08:00:05.383 回答