Skip to content

Commit 40ef676

Browse files
committed
Add multiple results set support with #execute_procedure for :dblib mode.
1 parent 8cbdac4 commit 40ef676

File tree

3 files changed

+30
-29
lines changed

3 files changed

+30
-29
lines changed

CHANGELOG

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
* master *
22

3+
* Add multiple results set support with #execute_procedure for :dblib mode. [Ken Collins]
4+
35
* Simplify encoding support. [Ken Collins]
46

57
* Add binary timestamp datatype handling. [Erik Bryn]

lib/active_record/connection_adapters/sqlserver/database_statements.rb

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,17 @@ def execute_procedure(proc_name, *variables)
7272
vars = variables.map{ |v| quote(v) }.join(', ')
7373
sql = "EXEC #{proc_name} #{vars}".strip
7474
name = 'Execute Procedure'
75-
results = []
76-
case @connection_options[:mode]
77-
when :dblib
78-
results << select(sql, name).map { |r| r.with_indifferent_access }
79-
when :odbc
80-
log(sql, name) do
75+
log(sql, name) do
76+
case @connection_options[:mode]
77+
when :dblib
78+
result = @connection.execute(sql)
79+
result.each(:as => :hash, :cache_rows => true) do |row|
80+
r = row.with_indifferent_access
81+
yield(r) if block_given?
82+
end
83+
result.each
84+
when :odbc
85+
results = []
8186
raw_connection_run(sql) do |handle|
8287
get_rows = lambda {
8388
rows = handle_to_names_and_values handle, :fetch => :all
@@ -89,11 +94,13 @@ def execute_procedure(proc_name, *variables)
8994
get_rows.call
9095
end
9196
end
97+
results.many? ? results : results.first
98+
when :adonet
99+
results = []
100+
results << select(sql, name).map { |r| r.with_indifferent_access }
101+
results.many? ? results : results.first
92102
end
93-
when :adonet
94-
results << select(sql, name).map { |r| r.with_indifferent_access }
95103
end
96-
results.many? ? results : results.first
97104
end
98105

99106
def use_database(database=nil)

test/cases/execute_procedure_test_sqlserver.rb

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,26 @@ def setup
99
should 'execute a simple procedure' do
1010
tables = @klass.execute_procedure :sp_tables
1111
assert_instance_of Array, tables
12-
assert_instance_of HashWithIndifferentAccess, tables.first
12+
assert tables.first.respond_to?(:keys)
1313
end
1414

1515
should 'take parameter arguments' do
1616
tables = @klass.execute_procedure :sp_tables, 'sql_server_chronics'
1717
table_info = tables.first
1818
assert_equal 1, tables.size
19-
assert_equal (ENV['ARUNIT_DB_NAME'] || 'activerecord_unittest'), table_info[:TABLE_QUALIFIER], "Table Info: #{table_info.inspect}"
20-
assert_equal 'TABLE', table_info[:TABLE_TYPE], "Table Info: #{table_info.inspect}"
19+
assert_equal (ENV['ARUNIT_DB_NAME'] || 'activerecord_unittest'), table_info['TABLE_QUALIFIER'], "Table Info: #{table_info.inspect}"
20+
assert_equal 'TABLE', table_info['TABLE_TYPE'], "Table Info: #{table_info.inspect}"
2121
end
2222

23-
if connection_mode_odbc?
24-
25-
should 'allow multiple result sets to be returned' do
26-
results1, results2 = @klass.execute_procedure('sp_helpconstraint','accounts')
27-
assert_instance_of Array, results1
28-
assert_instance_of HashWithIndifferentAccess, results1.first
29-
assert results1.first['Object Name']
30-
assert_instance_of Array, results2
31-
assert_instance_of HashWithIndifferentAccess, results2.first
32-
assert results2.first['constraint_name']
33-
assert results2.first['constraint_type']
34-
end
35-
36-
else
37-
38-
should 'allow multiple result sets to be returned'
39-
23+
should 'allow multiple result sets to be returned' do
24+
results1, results2 = @klass.execute_procedure('sp_helpconstraint','accounts')
25+
assert_instance_of Array, results1
26+
assert results1.first.respond_to?(:keys)
27+
assert results1.first['Object Name']
28+
assert_instance_of Array, results2
29+
assert results2.first.respond_to?(:keys)
30+
assert results2.first['constraint_name']
31+
assert results2.first['constraint_type']
4032
end
4133

4234

0 commit comments

Comments
 (0)