Skip to content

Commit 8380c4b

Browse files
committed
Use native affected rows and scope identity.
1 parent c902bc4 commit 8380c4b

File tree

1 file changed

+21
-6
lines changed

1 file changed

+21
-6
lines changed

lib/active_record/connection_adapters/sqlserver/database_statements.rb

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ def select_rows(sql, name = nil)
1313
end
1414

1515
def execute(sql, name = nil, skip_logging = false)
16-
if table_name = query_requires_identity_insert?(sql)
17-
with_identity_insert_enabled(table_name) { do_execute(sql,name) }
16+
if id_insert_table_name = query_requires_identity_insert?(sql)
17+
with_identity_insert_enabled(id_insert_table_name) { do_execute(sql,name) }
1818
else
1919
do_execute(sql,name)
2020
end
@@ -187,12 +187,24 @@ def select(sql, name = nil)
187187
end
188188

189189
def insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil)
190-
super || select_value("SELECT CAST(SCOPE_IDENTITY() AS bigint) AS Ident")
190+
@insert_sql = true
191+
case @connection_options[:mode]
192+
when :dblib
193+
execute(sql, name) || id_value
194+
else
195+
super || select_value("SELECT CAST(SCOPE_IDENTITY() AS bigint) AS Ident")
196+
end
191197
end
192198

193199
def update_sql(sql, name = nil)
194-
execute(sql, name)
195-
select_value('SELECT @@ROWCOUNT AS AffectedRows')
200+
@update_sql = true
201+
case @connection_options[:mode]
202+
when :dblib
203+
execute(sql, name)
204+
else
205+
execute(sql, name)
206+
select_value('SELECT @@ROWCOUNT AS AffectedRows')
207+
end
196208
end
197209

198210
# === SQLServer Specific ======================================== #
@@ -213,12 +225,15 @@ def do_execute(sql, name = nil)
213225
def raw_connection_do(sql)
214226
case @connection_options[:mode]
215227
when :dblib
216-
@connection.execute(sql).do
228+
@insert_sql ? @connection.execute(sql).insert : @connection.execute(sql).do
217229
when :odbc
218230
@connection.do(sql)
219231
else :adonet
220232
@connection.create_command.tap{ |cmd| cmd.command_text = sql }.execute_non_query
221233
end
234+
ensure
235+
@insert_sql = false
236+
@update_sql = false
222237
end
223238

224239
# === SQLServer Specific (Selecting) ============================ #

0 commit comments

Comments
 (0)