diff --git a/lib/active_record/connection_adapters/sqlserver/database_statements.rb b/lib/active_record/connection_adapters/sqlserver/database_statements.rb index 946a84ad3..f219ce20f 100644 --- a/lib/active_record/connection_adapters/sqlserver/database_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/database_statements.rb @@ -331,11 +331,7 @@ def sp_executesql_types_and_parameters(binds) def sp_executesql_sql_type(attr) return attr.type.sqlserver_type if attr.respond_to?(:type) && attr.type.respond_to?(:sqlserver_type) - value = if attr.is_a?(Symbol) || attr.is_a?(String) || attr.is_a?(Numeric) - attr - else - attr.value_for_database - end + value = basic_attribute_type?(attr) ? attr : attr.value_for_database if value.is_a?(Numeric) value > 2_147_483_647 ? "bigint".freeze : "int".freeze @@ -345,7 +341,7 @@ def sp_executesql_sql_type(attr) end def sp_executesql_sql_param(attr) - return quote(attr) if attr.is_a?(Symbol) || attr.is_a?(String) || attr.is_a?(Numeric) + return quote(attr) if basic_attribute_type?(attr) case value = attr.value_for_database when Type::Binary::Data, ActiveRecord::Type::SQLServer::Data @@ -355,6 +351,16 @@ def sp_executesql_sql_param(attr) end end + def basic_attribute_type?(type) + type.is_a?(Symbol) || + type.is_a?(String) || + type.is_a?(Numeric) || + type.is_a?(Time) || + type.is_a?(TrueClass) || + type.is_a?(FalseClass) || + type.is_a?(NilClass) + end + def sp_executesql_sql(sql, types, params, name) if name == "EXPLAIN" params.each.with_index do |param, index|