存储过程中接受永远无法正常工作的 SQL Server 查询


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系统上

如果将名为t1的列添加到任一表中,并且还将名为c1的类型方法添加到数据库中,则可以工作(从 SQL 编译器的角度来看(。

由于编译器不知道将来可能会添加哪些名称和方法,因此延迟名称解析的规则说它必须接受它。

简而言之,它不是语法错误,因此不会被拒绝。


像这样的问题确实应该在调试期间发现,但是如果你想在解析和保存存储过程时捕获,你可以通过执行以下操作来完成它:

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 和空间(都包含只能用于这些数据类型的特殊方法。 下面是 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的可选附加组件(扩展((然后它们被内置到下一个主要版本中(。 此外,我相信(不确定(客户和第三方也可以自己制作并将它们添加到现有数据库中。

最新更新