存储过程中接受永远不能工作的SQL Server查询

时间:2018-05-22 21:48:08

标签: sql sql-server tsql sql-server-2008-r2

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

1 个答案:

答案 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的可选附加组件(扩展)(它们随后被内置到下一个主要版本中)。此外,我相信(不确定)客户和第三方也可以自己制作并将它们添加到现有数据库中。