我试图通过Zend \ Db组件将几行插入到MSSQL服务器数据库中。某些字段包含德语格式的日期,因此DD.MM.YYYY但SQL Server需要YYYY-MM-DD。 SET DATEFORMAT DMY选项通过SQL Management Studio解决了我的问题。但是在PHP中并使用Zend \ Db我必须将此语句放在每个INSERT语句的前面。我不知道为什么?是不是可以为整个会话设置此选项?
示例:
// $this->db is an instance of \Zend\Db\Adapter\Adapter
$this->db->query("SET LANGUAGE German;")->execute();
$this->db->query("SET DATEFORMAT dmy;")->execute();
$sql = "INSERT INTO {$table}(";
...
$statement = $this->db->query($sql);
$result = $statement->execute();
结果:
Statement could not be executed (22007 - 241 - [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Conversion failed when converting date and/or time from character string.)
然而,当我写:
$sql = "SET DATEFORMAT DMY; INSERT INTO {$table}(";
它有效。
有什么错误或我需要改变的建议吗?谢谢!
答案 0 :(得分:0)
使用基于dbAdapter->query()->execute()
的此方法,您将剥夺自己的丰富类Zend\Db\Sql
。
通过Zend\Db\Sql\Insert
,只需按如下方式扩展此类:
namespace MyProject\Db\Sql;
use Zend\Db\Sql\Insert as ZendInsert;
class Insert extends ZendInsert {
/**
* @var array Specification array
*/
protected $specifications = [
self::SPECIFICATION_INSERT => 'SET DATEFORMAT DMY; INSERT INTO %1$s (%2$s) VALUES (%3$s)',
self::SPECIFICATION_SELECT => 'SET DATEFORMAT DMY; INSERT INTO %1$s %2$s %3$s',
];
}