【问题标题】:Migrating from MySQL to MS SQL从 MySQL 迁移到 MS SQL
【发布时间】:2017-01-11 12:49:45
【问题描述】:

我有一个 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 查询(将是一项艰巨的任务),或者有什么方法可以处理这个问题。

【问题讨论】:

  • 在这两个数据库中,日期常量应该用单引号括起来。此查询不需要反引号。

标签: php sql sql-server codeigniter iis-8


【解决方案1】:

据我所知,SQL Server 不支持使用反引号来转义表名或列名(您可以改用括号)。您可以通过运行类似

的简单查询轻松尝试此操作
select * from `ctbl_events`

如果这不起作用,您几乎肯定必须更新所有查询以用括号替换反引号。

查询可能失败的第二个原因是查询中的日期必须用引号括起来,并且与 SQL Server 的日期格式匹配(这是可配置的,因此您可能需要进行一些试验)。

因此,您尝试运行的查询应如下所示:

SELECT * from ctbl_events 
WHERE '2017-01-11' <= startdate 
AND [enddate] >= '2017-01-11' 
and status=0 
ORDER BY [ctbl_events].[id]

尽管在这种情况下,您实际上并不需要用括号括住表名或列名 - 最好为此达成一个标准并坚持下去。

【讨论】:

    猜你喜欢
    • 2011-09-04
    • 2010-09-18
    • 2011-07-22
    • 2010-09-12
    • 2011-09-25
    • 1970-01-01
    • 2011-06-17
    • 2014-05-24
    • 1970-01-01
    相关资源
    最近更新 更多