从 MySQL 迁移到 MS SQL
Migrating from MySQL to MS SQL
我有一个 PHP (CODEIGNITER) 应用程序,它通常部署在 Apache/MySQL 组合上。我最近在 IIS8 和 MS SQL 11.0.2100.60
上部署了它
我通过使用 ODBC 连接迁移到 Access 数据库然后再次使用另一个 ODBC 连接迁移到 MS SQL 来迁移表和数据。我修改了 PHP 应用程序(PHP.ini、database.php、db_driver.php)的配置,以确保它正确连接并在 IIS 上运行。
我现在遇到 SQL 语法问题。当我尝试 运行 应用程序时,它没有给我数据库连接错误(它之前给出了)但是当我尝试登录到应用程序时(它具有用户身份验证) - 我收到以下错误:
Error Number: 42000
[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Incorrect syntax near '`'.
SELECT * from ctbl_events WHERE 2017-01-11 <= startdate AND `enddate` >= 2017-01-11 and status=0 ORDER BY `ctbl_events`.`id`
Filename: C:\inetpub\wwwroot\GMS\system\database\DB_driver.php
Line Number: 330
这是否意味着问题出在 ` 符号上,如果是,我是否必须手动修改我的应用程序中的所有 SQL 查询(这将是一项艰巨的任务),或者有什么方法可以处理这个问题.
据我所知,SQL 服务器不支持使用反引号转义 table 或列名(您可以改用括号)。您可以通过 运行 一个简单的查询(例如
)轻松地尝试此操作
select * from `ctbl_events`
如果这不起作用,您几乎可以肯定必须更新所有查询以用方括号替换反引号。
查询可能失败的第二个原因是查询中的日期必须用引号括起来,并匹配 SQL 服务器的日期格式(这是可配置的,因此您可能需要稍微试验一下)。
因此,您尝试 运行 的查询应该看起来有点像这样:
SELECT * from ctbl_events
WHERE '2017-01-11' <= startdate
AND [enddate] >= '2017-01-11'
and status=0
ORDER BY [ctbl_events].[id]
尽管在这种情况下,您实际上并不需要 table 或列名周围的方括号 - 最好就此达成一致的标准并坚持使用。
我有一个 PHP (CODEIGNITER) 应用程序,它通常部署在 Apache/MySQL 组合上。我最近在 IIS8 和 MS SQL 11.0.2100.60
上部署了它我通过使用 ODBC 连接迁移到 Access 数据库然后再次使用另一个 ODBC 连接迁移到 MS SQL 来迁移表和数据。我修改了 PHP 应用程序(PHP.ini、database.php、db_driver.php)的配置,以确保它正确连接并在 IIS 上运行。
我现在遇到 SQL 语法问题。当我尝试 运行 应用程序时,它没有给我数据库连接错误(它之前给出了)但是当我尝试登录到应用程序时(它具有用户身份验证) - 我收到以下错误:
Error Number: 42000
[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Incorrect syntax near '`'.
SELECT * from ctbl_events WHERE 2017-01-11 <= startdate AND `enddate` >= 2017-01-11 and status=0 ORDER BY `ctbl_events`.`id`
Filename: C:\inetpub\wwwroot\GMS\system\database\DB_driver.php
Line Number: 330
这是否意味着问题出在 ` 符号上,如果是,我是否必须手动修改我的应用程序中的所有 SQL 查询(这将是一项艰巨的任务),或者有什么方法可以处理这个问题.
据我所知,SQL 服务器不支持使用反引号转义 table 或列名(您可以改用括号)。您可以通过 运行 一个简单的查询(例如
)轻松地尝试此操作select * from `ctbl_events`
如果这不起作用,您几乎可以肯定必须更新所有查询以用方括号替换反引号。
查询可能失败的第二个原因是查询中的日期必须用引号括起来,并匹配 SQL 服务器的日期格式(这是可配置的,因此您可能需要稍微试验一下)。
因此,您尝试 运行 的查询应该看起来有点像这样:
SELECT * from ctbl_events
WHERE '2017-01-11' <= startdate
AND [enddate] >= '2017-01-11'
and status=0
ORDER BY [ctbl_events].[id]
尽管在这种情况下,您实际上并不需要 table 或列名周围的方括号 - 最好就此达成一致的标准并坚持使用。