如果将名为t1 的列添加到任一表中并且名为c1 的类型方法也添加到数据库中。
由于编译器不知道将来可能会添加哪些名称和方法,因此延迟名称解析的规则说它必须接受。
简而言之,它不是语法错误,所以它不会不被拒绝。
这样的问题确实应该在调试过程中发现,但是如果你想在解析和保存存储过程时发现它,你可以通过执行以下操作来完成它:
create procedure tempsproc
as
select t1.c1
from #t
join t2 on #t.c2 = t3.c3
go
BEGIN TRANSACTION
EXEC tempsproc;
ROLLBACK TRANSACTION
go
类型方法
我被要求解释类型方法,所以在这里。
大多数较新的数据类型,例如 XML 和 Spatial,都包含只能用于这些数据类型的特殊方法。以下是 Microsoft 的示例:
CREATE TABLE SpatialTable
( id int IDENTITY (1,1),
GeomCol1 geometry,
GeomCol2 AS GeomCol1.STAsText() );
GO
INSERT INTO SpatialTable (GeomCol1)
VALUES (geometry::STGeomFromText('LINESTRING (100 100, 20 180, 180 180)', 0));
这显示了两种截然不同的方法格式(GeomCol1.STAsText() 和geometry::STGeomFromText('...')),这突出了另一点。
此语法符合某些标准(本例中为 OGC)。 XML 方法必须符合不同的标准。他们将来添加的其他数据类型可能还必须符合其他标准,这意味着他们必须非常灵活地了解方法的允许语法,包括它是否有任何括号。
最后,您可能想知道,“但他们不提前知道存在哪些数据类型方法吗?”令人惊讶的是,答案是“否”,因为 SQL Server 允许新的数据-要添加到现有服务器和数据库的类型。因此,例如,XML 数据类型最初是 SQL Server 的可选附加组件(扩展)(然后它们被内置到下一个主要版本中)。此外,我相信(不确定)客户和第三方也可以自己制作并将它们添加到现有数据库中。