Views: 3383
Last Modified: 30.03.2022
ORM is also suitable for such exotic queries for data retrieval targeting not the table, but stored procedures. Such procedures can be created in MSSQL-database.
Indicate the function name in the method getTableName:
public static function getTableName()
{
// return "foo_table_name"
return "foo_table_procedure()";
}
This code won't work as demonstrated. The reason: when using the connection Bitrix\Main\DB\MssqlConnection all table name entries are pre-screened. An attempt to directly execute such query will cause a thrown exception:
MS Sql query error: Invalid object name 'foo_table_procedure()'. (400)
SELECT
[base].[bar] AS [BAR],
[base].[baz] AS [BAZ],
FROM [foo_table_procedure()] [base]
Getting a required result is prevented only by characters [ and ], used by MssqlSqlHelper to protect the "table" name. You can resolve this issue by creating a custom Connection and SqlHelper.
Alternate solution: install a server mssql extension and implement the following architecture:
class MssqlSqlHelper extends Bitrix\Main\DB\SqlHelper
{
public function quote($identifier)
{
if (self::isKnowFunctionalCall($identifier))
{
return $identifier
}
else
{
return parent::quote($identifier);
}
}
}
Where self::isKnownFunctionCall is a verification method, returning true, if $identifier is located in “foo_table_procedure()”
.