在创建SQL Server视图时,我可以指定列类型吗?

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';

这个有正确的语法吗?

1个回答

29

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

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

关于空/非空方面的问题,SQL Server需要进行推断。如果您有一个列知道它将是not null,但SQL Server得出的结果不正确,您可以将其包装在一个带有非空第二个参数的ISNULL语句中:

SELECT ISNULL(ColumnSQLServerThinksCanBeNull,'abc')

然后它将把该列描述为非空。第二个值并不重要(毕竟这是关于我自己的声明,该列永远不会为空),只要它与该列的兼容类型相同即可。


我已经尝试使用CAST()而不是CONVERT()来解决这个问题,但视图仍然保留了原始的“猜测数据类型”。CONVERT()会在视图“强制执行”之前强制执行它。谢谢! - Fandango68
不是你的错,但 SQL 视图旨在简化查询,而不是让你对每个列数据类型有深入了解以便减轻数据库的负担。 - alejandrob
1
@alejandrob - SQL视图可以实现许多不同的目的。如果您只使用它们来简化查询,那就这样吧,但不要忽视其他人可能会以不同的方式使用它们。 - Damien_The_Unbeliever
确实,上周我找到了这个的用途,而且效果非常好。谢谢。 - alejandrob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接