use*_*221 -1 sql t-sql sql-server sql-server-2008-r2
create procedure tempsproc
as
select t1.c1
from #t
join t2 on #t.c2 = t3.c3
Run Code Online (Sandbox Code Playgroud)
select子句引用了from子句中未提及的表.我听说过延迟名称解析但我不知道无论运行时存在哪些表,上面的选择如何工作.
on子句还引用了from子句中未提及的表.
上面的SQL编译没有错误.
这个问题只在运行时出现 - 而不是你想要的
为了在编译时SQL Server拒绝上述过程,我需要做什么?
PS:这是在SQL Server 2008 R2 sp3系统上
这可以(从SQL编译器的角度)的工作,如果一个指定列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
Run Code Online (Sandbox Code Playgroud)
类型方法
我被要求解释类型方法,所以在这里.
大多数较新的数据类型(如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));
Run Code Online (Sandbox Code Playgroud)
这显示了两种截然不同的方法格式(GeomCol1.STAsText()和geometry::STGeomFromText('...')),这突出了另一点.
此语法符合某些标准(在本例中为OGC).XML方法必须符合不同的标准.他们将来添加的其他数据类型可能必须符合其他标准,这意味着他们必须非常灵活地了解方法的可允许语法,包括它是否有任何括号.
最后,您可能想知道," 但他们不提前知道存在哪些数据类型方法? "令人惊讶的是,答案是"否",因为SQL Server允许将新数据类型添加到现有服务器和数据库中.因此,例如,XML数据类型最初是SQL Server的可选附加组件(扩展)(它们随后被内置到下一个主要版本中).此外,我相信(不确定)客户和第三方也可以自己创建并将它们添加到现有数据库中.
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |