@@ -393,19 +393,33 @@ def drop_schema(schema_name)
393
393
execute "DROP SCHEMA [#{ schema_name } ]"
394
394
end
395
395
396
+ # Returns an array of schema names.
397
+ def schema_names
398
+ sql = <<~SQL . squish
399
+ SELECT name
400
+ FROM sys.schemas
401
+ WHERE
402
+ name NOT LIKE 'db_%' AND
403
+ name NOT IN ('INFORMATION_SCHEMA', 'sys')
404
+ SQL
405
+
406
+ query_values ( sql , "SCHEMA" )
407
+ end
408
+
396
409
private
397
410
398
411
def data_source_sql ( name = nil , type : nil )
399
- scope = quoted_scope name , type : type
412
+ scope = quoted_scope ( name , type : type )
400
413
401
- table_name = lowercase_schema_reflection_sql 'TABLE_NAME'
402
- database = scope [ :database ] . present? ? "#{ scope [ :database ] } ." : ""
414
+ table_schema = lowercase_schema_reflection_sql ( 'TABLE_SCHEMA' )
415
+ table_name = lowercase_schema_reflection_sql ( 'TABLE_NAME' )
416
+ database = scope [ :database ] . present? ? "#{ scope [ :database ] } ." : ""
403
417
table_catalog = scope [ :database ] . present? ? quote ( scope [ :database ] ) : "DB_NAME()"
404
418
405
- sql = "SELECT #{ table_name } "
419
+ sql = "SELECT CONCAT( #{ table_schema } , '.', #{ table_name } ) "
406
420
sql += " FROM #{ database } INFORMATION_SCHEMA.TABLES WITH (NOLOCK)"
407
421
sql += " WHERE TABLE_CATALOG = #{ table_catalog } "
408
- sql += " AND TABLE_SCHEMA = #{ quote ( scope [ :schema ] ) } "
422
+ sql += " AND TABLE_SCHEMA = #{ quote ( scope [ :schema ] ) } " if scope [ :schema ]
409
423
sql += " AND TABLE_NAME = #{ quote ( scope [ :name ] ) } " if scope [ :name ]
410
424
sql += " AND TABLE_TYPE = #{ quote ( scope [ :type ] ) } " if scope [ :type ]
411
425
sql += " ORDER BY #{ table_name } "
@@ -414,9 +428,10 @@ def data_source_sql(name = nil, type: nil)
414
428
415
429
def quoted_scope ( name = nil , type : nil )
416
430
identifier = SQLServer ::Utils . extract_identifiers ( name )
431
+
417
432
{ } . tap do |scope |
418
433
scope [ :database ] = identifier . database if identifier . database
419
- scope [ :schema ] = identifier . schema || "dbo"
434
+ scope [ :schema ] = identifier . schema || "dbo" if name . present?
420
435
scope [ :name ] = identifier . object if identifier . object
421
436
scope [ :type ] = type if type
422
437
end
0 commit comments