create procedure tempsproc
as
select t1.c1
from #t
join t2 on #t.c2 = t3.c3
select子句引用from子句中未提及的表。 我听说过延迟名称解析,但我不知道无论运行时存在哪些表,上面的选择如何工作。
on子句还引用了from子句中未提及的表。
上面的SQL编译没有错误。
这个问题只在运行时出现 - 而不是你想要的
为了在编译时SQL Server拒绝上述过程,我需要做什么?
PS:这是在SQL Server 2008 R2 sp3系统上
答案 0 :(得分:5)
如果将名为t1
的列添加到任一表中,并将类型方法添加到{{em>方法,则可以工作(从SQL编译器角度来看) 1}}也被添加到数据库中。
由于编译器不知道将来可能添加的名称和方法,因此延迟名称解析规则表明它必须接受它。
简而言之,它不语法错误,因此 NOT 将被拒绝。
这样的问题确实应该在调试过程中得到解决,但是如果你想在解析和保存存储过程时抓住它,你可以通过这样的方式来完成它:
c1
TYPE METHODS
我被要求解释类型方法,所以在这里。
大多数较新的数据类型(如XML和Spatial)都包含只能在这些数据类型上使用的特殊方法。这是微软的一个例子:
create procedure tempsproc
as
select t1.c1
from #t
join t2 on #t.c2 = t3.c3
go
BEGIN TRANSACTION
EXEC tempsproc;
ROLLBACK TRANSACTION
go
这显示了两种截然不同的方法格式(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()
),这突出了另一点。
此语法符合某些标准(本例中为OGC)。 XML方法必须符合不同的标准。他们将来添加的其他数据类型可能必须符合其他标准,这意味着他们必须非常灵活地了解方法的可允许语法,包括它是否有任何括号。
最后,你可能想知道," 但他们没有提前知道存在哪些数据类型方法?"令人惊讶的是,答案是" NO",因为SQL Server允许将新数据类型添加到现有服务器和数据库。因此,例如,XML数据类型最初是SQL Server的可选附加组件(扩展)(它们随后被内置到下一个主要版本中)。此外,我相信(不确定)客户和第三方也可以自己制作并将它们添加到现有数据库中。