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

Posted

技术标签:

【中文标题】在存储过程中接受永远无法工作的 SQL Server 查询【英文标题】:SQL Server query that can never work is accepted in stored procedure 【发布时间】:2018-05-22 21:48:08 【问题描述】:
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】:

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

【讨论】:

能否请您提供更多详细信息,说明为了在运行时不会出错需要发生什么?我不熟悉类型方法。但是,即使您是对的,也应该选择加入这种行为。默认情况下,应该根据现在存在的内容检查语法,而不是将来可能发生的疯狂事情。有没有办法让它以理智的方式行事? @user2849221 你反对的是延迟名称解析的本质。为什么它是一个非常好的东西有很多原因。我曾在没有它的环境中工作过,它们令人难以忍受,尤其是在开发和部署方面。 对于类型方法,它们是一个晦涩难懂的特性(主要用于 XML),将来可能会更多地使用。 没有具体的矛盾我坚持我的说法,即上面的存储过程永远不会没有错误地运行,因此应该被拒绝。至于在您不知道从某个时刻到另一个时刻会存在哪些表的环境中工作,那一定是具有挑战性的 @user2849221 好的,看来您并不是真的在问问题,而是在试图提出论点。这不是那个论坛。如果您想就 Microsoft 的设计决策争论不休,您应该与他们讨论。这个论坛是针对特定编程问题的,我已经回答了。关于“具体矛盾”,您还希望我提供什么?听起来您认为我正在编造关于未来可能的方法的部分,我该如何帮助您?

以上是关于在存储过程中接受永远无法工作的 SQL Server 查询的主要内容,如果未能解决你的问题,请参考以下文章

我的 SQL 存储过程中的 HTML 格式化语法无法正常工作

从SQL代理作业调用时,工作存储过程失败

带有 Like 语句的 MS-Access 上的 SQL 请求似乎永远无法正常工作

SQL Server:更改存储过程以接受参数

无法使用 oracle 存储过程在水晶报表 2013 中创建报表

接受多个 Id 值的 T-SQL 存储过程