diff --git a/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb b/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb index 478422807..13a612c00 100644 --- a/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +++ b/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb @@ -3,34 +3,36 @@ module ConnectionAdapters module Sqlserver module CoreExt module Explain - + SQLSERVER_STATEMENT_PREFIX = "EXEC sp_executesql " SQLSERVER_PARAM_MATCHER = /@\d+ =/ - + def exec_explain(queries) unprepared_queries = queries.map { |sql, bind| [unprepare_sqlserver_statement(sql), bind] } super(unprepared_queries) end - + private - - # This is somewhat hacky, but it should reliably reformat our prepared sql statment - # which uses sp_executesql to just the first argument, then unquote it. Likewise our + + # This is somewhat hacky, but it should reliably reformat our prepared sql statment + # which uses sp_executesql to just the first argument, then unquote it. Likewise our # do_exec_query method should substitude the @n args withe the quoted values. def unprepare_sqlserver_statement(sql) if sql.starts_with?(SQLSERVER_STATEMENT_PREFIX) executesql = sql.from(SQLSERVER_STATEMENT_PREFIX.length) executesql_args = executesql.split(', ') - executesql_args.reject! { |arg| arg =~ SQLSERVER_PARAM_MATCHER } - executesql_args.pop if executesql_args.many? + has_sqlserver_params = executesql_args.reject! { |arg| arg =~ SQLSERVER_PARAM_MATCHER } + if has_sqlserver_params + executesql_args.pop if executesql_args.many? + end executesql = executesql_args.join(', ').strip.match(/N'(.*)'/)[1] Utils.unquote_string(executesql) else sql end end - - + + end end end