我已经在 Ubuntu 16.04 机器上为 SQL Server 设置了 Microsoft ODBC Driver 13。我现在正在尝试测试一个数据库连接,其中包括服务器名称和实例名称。
以下都可以在 Windows 机器上正常工作:
sqlcmd -S "SERVERNAME\INSTANCENAME" -U User -P pwd -d DatabaseName -Q "SELECT TOP 5 Id FROM dbo.MyTable;"
sqlcmd -S SERVERNAME\INSTANCENAME -U User -P pwd -d DatabaseName -Q "SELECT TOP 5 Id FROM dbo.MyTable;"
Run Code Online (Sandbox Code Playgroud)
但是,它们都不适用于 Linux - 它们都返回下面的错误消息。该错误意味着找不到服务器:
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Login timeout expired.
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : MAX_PROVS: Error Locating Server/Instance Specified [xFFFFFFFF]. . …Run Code Online (Sandbox Code Playgroud) 我正在使用包装 SQL 语句的应用程序 (MapServer - http://mapserver.org/ ),以便 ORDER BY 语句位于内部查询中。例如
SELECT * FROM (
SELECT ID, GEOM, Name
FROM t
ORDER BY Name
) as tbl
Run Code Online (Sandbox Code Playgroud)
该应用程序有许多不同的数据库驱动程序。我主要使用 MS SQL Server 驱动程序和 SQL Server 2008。如果在子查询中找到 ORDER BY,则会引发错误。
来自 MS Docs(虽然这适用于 SQL Server 2000,但它似乎仍然适用):
当您在视图、内联函数、派生表或子查询中使用 ORDER BY 子句时,它不保证有序输出。相反,ORDER BY 子句仅用于保证由 Top 运算符生成的结果集具有一致的构成。ORDER BY 子句仅在最外面的 SELECT 语句中指定时才保证有序的结果集。
但是,在 Postgres (9) 和 Oracle 中运行时,相同类型的查询会返回结果 - 其顺序与子查询中定义的顺序相同。在 Postgres 中,查询计划显示结果已排序,并且 Postgres 发行说明包括暗示使用子查询顺序的项目:
当子查询 ORDER BY 匹配上查询时避免排序
http://en.wikipedia.org/wiki/Order_by指出:
尽管一些数据库系统允许在子选择或视图定义中指定 ORDER BY 子句,但存在没有影响。
但是,从我自己对查询计划的检查来看: