Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 订购前没有空间-为什么这样做?_Sql_Sql Server - Fatal编程技术网

Sql 订购前没有空间-为什么这样做?

Sql 订购前没有空间-为什么这样做?,sql,sql-server,Sql,Sql Server,我在一个应用程序中遇到了一些SQL,在“orderby”子句之前没有空格。我感到惊讶的是,这甚至起作用 给定一个名为[counter]的数字表,其中只有一列,counter_id是一个递增的整数列表,此SQL在Microsoft SQL Server 2012中运行良好 select * FROM [counter] c where c.counter_id = 1000ORDER by counter_id 这也适用于字符串,例如: WHERE some_string = 'test'ORD

我在一个应用程序中遇到了一些SQL,在“orderby”子句之前没有空格。我感到惊讶的是,这甚至起作用

给定一个名为[counter]的数字表,其中只有一列,counter_id是一个递增的整数列表,此SQL在Microsoft SQL Server 2012中运行良好

select
*
FROM [counter] c
where c.counter_id = 1000ORDER by counter_id
这也适用于字符串,例如:

WHERE some_string = 'test'ORDER BY something

我的问题是,这个问题有没有潜在的陷阱或危险?反过来说,有什么好处吗?除了为该空白保存8位网络流量(在某些应用程序中,whcih很可能是一个考虑因素)

正如jarlh提到的,在扫描和解析令牌期间可能会有差异,但在执行计划期间它会正确创建,因此它的优缺点可能不会有太大差异


当解析器检查字符时,它会检查关键字、标识符、字符串常量,并匹配语言的整体语义和语法结构。因为“orderby”是一个关键字,sql解析器知道它在查询中可能的语法位置,所以它将相应地解释它,而不会抛出任何错误。这就是为什么您的order by不会抛出任何错误的原因。


让我解释一下为什么这适用于数字和字符串

原因是数字不能启动标识符,除非名称被转义。基本上,SQL查询发生的第一件事是标记化。也就是说,查询的组件被分解为标识符和关键字,然后进行分析

在SQL Server中,关键字、标识符和函数名(等等)不能以数字开头(当然,除非名称转义)。因此,当标记器遇到一个数字时,它知道它有一个数字。遇到非数字字符时,数字结束。因此,像
1000ORDER BY
这样的字符序列很容易被转换成三个标记,
1000
ORDER
,和
BY

类似地,第一次遇到单引号时,它总是表示字符串文字。字符串文字在遇到最后一个单引号时结束。下一组字符表示另一个标记


让我补充一点,完全没有理由使用这些细微差别。首先,这些规则是SQL Server标记化的属性,不一定适用于其他数据库。其次,SQL的目的是让人们能够表达查询。我们读取它们是非常非常重要的。

无论是否与空间无关,扫描仪都能够读取这些标记。但不要指望它。以后的版本可能会有所不同。不确定,但查询解析器或扫描仪就是这样设计的
select*from tbl
也会起作用。这并不含糊,因为
O
不是数字的有效部分,所以它不能是数字的一部分,
1000ORDER
不是有效的列名(无引号),所以
1000
必须是数字的一部分。但我只看到了使用这种方法的缺点。我认为,如果你可以使用参数化存储过程并减少更多的存储过程,那么试图通过使用这种方法来节省网络流量是在考虑问题。我想这是可行的,因为当他们解析SQL时,设计师创建了一个规则,当一个不能作为数字一部分的字符出现时,数字结束,现在这并不总是意味着任何非数字,因为。E和-可以以数字形式出现,在某些地方-答案是“它足够聪明,可以解决它”它必须首先拉出字符串,否则如何选择“*FROM MyTable”[ORDER BY X],这不应该是一个问题,因为解析器在生成词法标记时会处理这些问题。这不会是一个问题,因为它可以工作,但它仍然必须在确定关键字之前确定字符串,它不能真正从发现关键字开始“遇到非数字字符时数字结束”——这是不对的,它可以遇到。或者甚至-