Skip to content

Commit e3bcabf

Browse files
author
Anna Carey
committed
better handling of updates with identiy column. Room for improvement.
1 parent 87188cb commit e3bcabf

File tree

2 files changed

+24
-11
lines changed

2 files changed

+24
-11
lines changed

lib/active_record/connection_adapters/sqlserver/database_statements.rb

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,12 @@ def execute(sql, name = nil)
1414
end
1515
end
1616

17-
# TODO: I bet there's a better way than a regex to take care of this
1817
def exec_query(sql, name = 'SQL', binds = [], sqlserver_options = {})
19-
# We can't update Identiy columns in sqlserver. So, strip out the id from the update.
20-
if sql =~ /UPDATE/
21-
# take off a comma before or after. This could probably be done better
22-
if sql =~ /, \[id\] = @?[0-9]*/
23-
sql.gsub!(/, \[id\] = @?[0-9]*/, '')
24-
elsif sql =~ /\s\[id\] = @?[0-9]*,/
25-
sql.gsub!(/\s\[id\] = @?[0-9]*,/, '')
26-
end
27-
end
28-
2918
if id_insert_table_name = sqlserver_options[:insert] ? query_requires_identity_insert?(sql) : nil
3019
with_identity_insert_enabled(id_insert_table_name) { do_exec_query(sql, name, binds) }
20+
elsif update_sql?(sql)
21+
sql = strip_ident_from_update(sql)
22+
do_exec_query(sql, name, binds)
3123
else
3224
do_exec_query(sql, name, binds)
3325
end

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,27 @@ def insert_sql?(sql)
366366
!(sql =~ /^\s*(INSERT|EXEC sp_executesql N'INSERT)/i).nil?
367367
end
368368

369+
def strip_ident_from_update(sql)
370+
# We can't update Identiy columns in sqlserver. So, strip out the id from the update.
371+
# There has to be a better way to handle this, but this'll do for now.
372+
table_name = get_table_name(sql)
373+
id_column = identity_column(table_name)
374+
375+
if id_column
376+
regex_col_name = Regexp.quote(quote_column_name(id_column.name))
377+
if sql =~ /, #{regex_col_name} = @?[0-9]*/
378+
sql = sql.gsub(/, #{regex_col_name} = @?[0-9]*/, '')
379+
elsif sql =~ /\s#{regex_col_name} = @?[0-9]*,/
380+
sql = sql.gsub(/\s#{regex_col_name} = @?[0-9]*,/, '')
381+
end
382+
end
383+
sql
384+
end
385+
386+
def update_sql?(sql)
387+
!(sql =~ /^\s*(UPDATE|EXEC sp_executesql N'UPDATE)/i).nil?
388+
end
389+
369390
def with_identity_insert_enabled(table_name)
370391
table_name = quote_table_name(table_name_or_views_table_name(table_name))
371392
set_identity_insert(table_name, true)

0 commit comments

Comments
 (0)