求SQL语法分析器思路

cloudfog 2003-07-21 08:07:59
想写一个算法对SQL语句进行分析,尤其是涉及到jion查询的情况
...全文
230 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cloudfog 2003-07-29
  • 打赏
  • 举报
回复
大家都说完了么,我要散分罗!
yangvxin1 2003-07-21
  • 打赏
  • 举报
回复
可以去看看《数据库系统导论》这本书。当然编译原理也得学。
hjb111 2003-07-21
  • 打赏
  • 举报
回复
学习数据库系统概念吧!
pengdali 2003-07-21
  • 打赏
  • 举报
回复
SET SHOWPLAN_TEXT
使 Microsoft? SQL Server? 不执行 Transact-SQL 语句。相反,SQL Server 返回有关如何执行语句的详细信息。

语法
SET SHOWPLAN_TEXT { ON | OFF }

注释
SET SHOWPLAN_TEXT 的设置是在执行或运行时设置,而不是在分析时设置。

当 SET SHOWPLAN_TEXT 为 ON 时,SQL Server 返回各个 Transact-SQL 语句的执行信息但不执行语句。将该选项设置为 ON 后,将返回有关所有后续 Transact-SQL 语句的信息,直到将该选项设置为 OFF 为止。例如,如果在 SET SHOWPLAN_TEXT 为 ON 时执行 CREATE TABLE 语句,SQL Server 将从涉及同一个表的后续 SELECT 语句返回错误信息;指定的表不存在。因此,对该表的后续引用将失败。当 SET SHOWPLAN_TEXT 为 OFF 时,SQL Server 执行语句但不生成报表。

SET SHOWPLAN_TEXT 用于返回可由 Microsoft MS-DOS? 应用程序(如 osql 实用工具)读取的输出。SET SHOWPLAN_ALL 返回更详细的输出供处理输出的程序使用。

在存储过程内不能指定 SET SHOWPLAN_TEXT 和 SET SHOWPLAN_ALL,它们必须是批处理中的语句。

SET SHOWPLAN_TEXT 将信息作为行集返回,行集形成一个层次结构树,用以表示 SQL Server 查询处理器在执行各语句时所采取的步骤。输出中反映的每个语句都包含一个含有语句文本的行,后面跟有几个含有执行步骤详细信息的行。下表显示输出中包含的列。

列名 描述
StmtText 对于不是 PLAN_ROW 类型的行,该列包含 Transact-SQL 语句的文本。对于 PLAN_ROW 类型的行,该列包含对操作的描述。该列包含物理运算符,也可以选择包含逻辑运算符。该列的后面还可以跟有由物理运算符决定的描述。有关物理运算符的更多信息,请参见 SET SHOWPLAN_ALL 中的 Argument 列。


有关可以在显示计划输出中看到的物理和逻辑运算符的更多信息,请参见逻辑运算符和物理运算符。

权限
SET SHOWPLAN_TEXT 权限默认授予所有用户。

示例
下例显示 SQL Server 在处理语句时如何使用索引。

下面是使用索引的查询:

SET SHOWPLAN_TEXT ON
GO
USE pubs
SELECT *
FROM roysched
WHERE title_id = 'PS1372'
GO
SET SHOWPLAN_TEXT OFF
GO

下面是结果集:

StmtText
------------------------------------------------------
USE pubs

SELECT *
FROM roysched
WHERE title_id = 'PS1372'

(2 row(s) affected)

StmtText
------------------------------------------------------------------------
|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([pubs].[dbo].[roysched]))
|--Index Seek(OBJECT:([pubs].[dbo].[roysched].[titleidind]), SEEK:([roysched].[title_id]='PS1372') ORDERED)

(2 row(s) affected)

下面是不使用索引的查询:

SET SHOWPLAN_TEXT ON
GO
USE pubs
SELECT *
FROM roysched
WHERE lorange < 5000
GO
SET SHOWPLAN_TEXT OFF
GO

下面是结果集:

StmtText
-------------------------------------------------
USE pubs

SELECT *
FROM roysched
WHERE lorange < 5000

(2 row(s) affected)

StmtText
------------------------------------------------------------------------
|--Table Scan(OBJECT:([pubs].[dbo].[roysched]), WHERE:([roysched].[lorange]<5000))

(1 row(s) affected)

zosky 2003-07-21
  • 打赏
  • 举报
回复
先去学编译原理吧

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧