Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » SQL 方言和兼容性 » SQL 方言 » 编写兼容的 SQL 语句

 

编写兼容的查询

若要编写在 SQL Anywhere 数据库和 Adaptive Server Enterprise 数据库上都能运行的查询,应遵循下面两条标准:

  • 查询中的数据类型、表达式和搜索条件必须兼容。

  • SELECT 语句本身的语法必须兼容。

本节将介绍兼容的 SELECT 语句语法,并说明兼容的数据类型、表达式和搜索条件。此示例假定 quoted_identifier 设置为 Off:这是 Adaptive Server Enterprise 的缺省设置,但不是 SQL Anywhere 的缺省设置。

SQL Anywhere 支持 Transact-SQL SELECT 语句的以下子集:

语法
SELECT [ ALL | DISTINCT ] select-list
...[ INTO #temporary-table-name ]
...[ FROM table-spec [ HOLDLOCK | NOHOLDLOCK ],
...  table-spec [ HOLDLOCK | NOHOLDLOCK ], ... ]
...[ WHERE search-condition ]
...[ GROUP BY column-name, ... ]
...[ HAVING search-condition ]
   [ ORDER BY { expression | integer }
      [ ASC | DESC ], ... ]
参数
select-list:
 table-name.*
|  *
| expression
| alias-name = expression
| expression as identifier  
| expression as string
table-spec:
[ owner . ]table-name
...[ [ AS ] correlation-name ]
 ...[ ( INDEX index_name [ PREFETCH size  ][ LRU | MRU ] ) ]
alias-name:
identifier | 'string' | "string"

SQL Anywhere 不支持 Transact-SQL SELECT 语句语法的以下关键字和子句:

注意
  • SQL Anywhere 不支持对 GROUP BY 子句的 Transact-SQL 扩展(它允许引用未用于创建组的列和表达式)。在 Adaptive Server Enterprise 中,此扩展会生成摘要报告。

  • 将会对表的说明的性能参数部分进行语法分析,但不会产生任何影响。

  • SQL Anywhere 支持 HOLDLOCK 关键字。利用 HOLDLOCK,指定表或视图上的共享锁会更为严格,因为当不再需要数据页时不会释放共享锁。对于已为其指定了 HOLDLOCK 的表,查询将在隔离级别 3 执行。

  • HOLDLOCK 选项仅应用于指定该选项的表或视图,并且仅应用于该选项所在的语句所定义的事务期间。如果将隔离级别设置为 3,则会将 HOLDLOCK 应用于事务中的每一个 SELECT 语句。您不能在一个查询中同时指定 HOLDLOCK 和 NOHOLDLOCK 选项。

  • SQL Anywhere 识别 NOHOLDLOCK 关键字,但该关键字不会产生任何影响。

  • Transact-SQL 使用 SELECT 语句向局部变量赋值:

    SELECT @localvar = 42;

    SQL Anywhere 中的相应语句为 SET 语句:

    SET @localvar = 42;
  • Adaptive Server Enterprise 不支持 SELECT 语句语法的以下子句:

    • INTO host-variable-list
    • INTO variable-list
    • 带括号的查询
  • Adaptive Server Enterprise 在 WHERE 子句中使用连接运算符,而不使用 FROM 子句和 ON 条件来进行连接。

另请参见