@@ -394,7 +394,7 @@ def run_with_isolation_level(isolation_level)
394
394
end
395
395
396
396
def select_rows ( sql , name = nil )
397
- raw_select ( sql , name ) . last
397
+ raw_select ( sql , name ) . first . last
398
398
end
399
399
400
400
def execute ( sql , name = nil , &block )
@@ -410,7 +410,11 @@ def execute_procedure(proc_name, *variables)
410
410
vars = variables . map { |v | quote ( v ) } . join ( ', ' )
411
411
sql = "EXEC #{ proc_name } #{ vars } " . strip
412
412
select ( sql , 'Execute Procedure' , true ) . inject ( [ ] ) do |results , row |
413
- results << row . with_indifferent_access
413
+ if row . kind_of? ( Array )
414
+ results << row . inject ( [ ] ) { |rs , r | rs << r . with_indifferent_access }
415
+ else
416
+ results << row . with_indifferent_access
417
+ end
414
418
end
415
419
end
416
420
@@ -824,7 +828,15 @@ def auto_reconnected?
824
828
825
829
def select ( sql , name = nil , ignore_special_columns = false )
826
830
repair_special_columns ( sql ) unless ignore_special_columns
827
- fields , rows = raw_select ( sql , name )
831
+ fields_and_row_sets = raw_select ( sql , name )
832
+ final_result_set = fields_and_row_sets . inject ( [ ] ) do |rs , fields_and_rows |
833
+ fields , rows = fields_and_rows
834
+ rs << zip_fields_and_rows ( fields , rows )
835
+ end
836
+ final_result_set . many? ? final_result_set : final_result_set . first
837
+ end
838
+
839
+ def zip_fields_and_rows ( fields , rows )
828
840
rows . inject ( [ ] ) do |results , row |
829
841
row_hash = { }
830
842
fields . each_with_index do |f , i |
@@ -859,24 +871,28 @@ def do_execute(sql,name=nil)
859
871
860
872
def raw_select ( sql , name = nil )
861
873
handle = raw_execute ( sql , name )
862
- fields = handle . columns ( true ) . map { |c |c . name }
863
- results = handle_as_array ( handle )
864
- rows = results . inject ( [ ] ) do |rows , row |
865
- row . each_with_index do |value , i |
866
- if value . is_a? ODBC ::TimeStamp
867
- row [ i ] = value . to_sqlserver_string
874
+ fields_and_row_sets = [ ]
875
+ loop do
876
+ fields = handle . columns ( true ) . map { |c |c . name }
877
+ results = handle_as_array ( handle )
878
+ rows = results . inject ( [ ] ) do |rows , row |
879
+ row . each_with_index do |value , i |
880
+ if value . is_a? ODBC ::TimeStamp
881
+ row [ i ] = value . to_sqlserver_string
882
+ end
868
883
end
884
+ rows << row
869
885
end
870
- rows << row
886
+ fields_and_row_sets << [ fields , rows ]
887
+ finish_statement_handle ( handle ) && break unless handle . more_results
871
888
end
872
- return fields , rows
889
+ fields_and_row_sets
873
890
end
874
891
875
892
def handle_as_array ( handle )
876
893
array = handle . inject ( [ ] ) do |rows , row |
877
894
rows << row . inject ( [ ] ) { |values , value | values << value }
878
895
end
879
- finish_statement_handle ( handle )
880
896
array
881
897
end
882
898
0 commit comments