En databases.yml:
slqserverdb:
class: sfPropelDatabase
param:
classname: MssqlPropelPDO
phptype: mssql
dsn: 'dblib:host=mihost;dbname=database'
username: usuario
password: password
encoding:
pooling: false
y en sqlserverdb.schema.yml defines las tablas que tienes en
sqlserver2000. Ojo, que según como sea tu modelo de datos puedes tener
problemas con el uso de Ids.
Ojo porque te encontrarás un problema con las últimas versiones de
propel, que estan configuradas para SQLServer 2005, que tiene una
serie de mejoras como ROW_NUM que no tiene sqlserver 2000. Para que no
te den problemas, deberías cambiar la función applyLimit del fichero
DBMSSQL.php por la que te pongo debajo. Si trabajas con SQLServer
2005, en rpincipio no tendrás ese problema.
public function applyLimit(&$sql, $offset, $limit)
{
// make sure offset and limit are numeric
if (!is_numeric($offset) || !is_numeric($limit)){
throw new Exception("DBMSSQL ::applyLimit() expects a number for
argument 2 and 3");
}
// obtain the original select statement
preg_match('/\A(.*)select(.*)from/si',$sql,$select_segment);
if (count($select_segment)>0)
{
$original_select = $select_segment[0];
} else {
throw new Exception("DBMSSQL ::applyLimit() could not locate the
select statement at the start of the query. ");
}
$modified_select = substr_replace($original_select, null,
stristr($original_select,'select') , 6 );
// obtain the original order by clause, or create one if there
isn't one
preg_match('/order by(.*)\Z/si',$sql,$order_segment);
if (count($order_segment)>0)
{
$order_by = $order_segment[0];
} else {
// no order by clause, if there are columns we can attempt to
sort by the columns in the select statement
$select_items = split(',',$modified_select);
if (count($select_items)>0)
{
$item_number = 0;
$order_by = null;
while ($order_by === null &&
$item_number<count($select_items))
{
if ($select_items[$item_number]!='*' && !
strstr($select_items[$item_number],'('))
{
$order_by = 'order by ' . $select_items[0] . ' asc';
}
$item_number++;
}
}
if ($order_by === null)
{
throw new Exception("DBMSSQL ::applyLimit() could not locate
the order by statement at the end of your query or any columns at the
start of your query. ");
} else {
$sql.= ' ' . $order_by;
}
}
// remove the original select statement
$sql = str_replace($original_select , null, $sql);
/* modify the sort order by for paging */
$inverted_order = '';
$order_columns = split(',',str_ireplace('order by ','',
$order_by));
$original_order_by = $order_by;
$order_by = '';
foreach ($order_columns as $column)
{
// strip "table." from order by columns
$column = array_reverse(split("\.",$column));
$column = $column[0];
// commas if we have multiple sort columns
if (strlen($inverted_order)>0){
$order_by.= ', ';
$inverted_order.=', ';
}
// put together order for paging wrapper
if (stristr($column,' desc'))
{
$order_by .= $column;
$inverted_order .= str_ireplace(' desc',' asc',$column);
} elseif (stristr($column,' asc')) {
$order_by .= $column;
$inverted_order .= str_ireplace(' asc',' desc',$column);
} else {
$order_by .= $column;
$inverted_order .= $column .' desc';
}
}
$order_by = 'order by ' . $order_by;
$inverted_order = 'order by ' . $inverted_order;
// build the query
$offset = ($limit+$offset);
$modified_sql = 'select * from (';
$modified_sql.= 'select top '.$limit.' * from (';
$modified_sql.= 'select top '.$offset.' '.$modified_select.$sql;
$modified_sql.= ') deriveda '.$inverted_order.') derivedb '.
$order_by;
$sql = $modified_sql;