sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo seleccionar nombres de columnas de varias tablas en SQL Server 2000-2008 que están en un conjunto de nombres

Para SQL Server 2005 y superior

FWIW para versiones más nuevas de SQL Server, prefiero las vistas de catálogo sobre INFORMATION_SCHEMA por las razones descritas en esta publicación de blog:

El caso contra INFORMATION_SCHEMA vistas

También vea advertencias como esta sobre el tema TABLES (Transact-SQL) en MSDN:

Entonces, la consulta que usaría sería la siguiente (filtrando los objetos del sistema y también evitando las tablas #temp en caso de que esté en tempdb):

SELECT t.name, c.name
  FROM sys.tables AS t
  INNER JOIN sys.columns AS c
  ON t.[object_id] = c.[object_id]
  WHERE c.name IN (N'name', N'firstname', etc.)
  AND t.is_ms_shipped = 0
  AND t.name NOT LIKE '#%';

Para repetir esto para todas las bases de datos:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
  UNION ALL SELECT db = N''' + name + ''', 
    t.name COLLATE Latin1_General_CI_AI, 
    c.name COLLATE Latin1_General_CI_AI
  FROM ' + QUOTENAME(name) + '.sys.tables AS t
  INNER JOIN ' + QUOTENAME(name) + 'sys.columns AS c
  ON t.[object_id] = c.[object_id]
  WHERE c.name IN (N''name'', N''firstname'', etc.)
  AND t.is_ms_shipped = 0
  AND t.name NOT LIKE ''#%'''
FROM sys.databases
-- WHERE ... -- probably don't need system databases at least

SELECT @sql = STUFF(@sql, 1, 18, '') 
  -- you may have to adjust  ^^ 18 based on copy/paste, cr/lf, tabs etc.
  + ' ORDER BY by db, s.name, o.name';

EXEC sp_executesql @sql;

(El COLLATE Las cláusulas están ahí para evitar errores en el caso de que tenga bases de datos con intercalaciones diferentes).

Para SQL Server 2000

Tenga en cuenta que lo anterior no ayuda para SQL Server 2000, pero no creo que deba tener como objetivo poder ejecutar la misma consulta en cada versión. SQL Server 2000 tiene 13 años y varios años sin soporte; seguramente puede justificar tener un código especial para ello. En cuyo caso, seguiría eligiendo la consulta que tiene sobre INFORMATION_SCHEMA , solo filtre los objetos del sistema y las tablas temporales (nuevamente, solo relevante en caso de que esté en tempdb):

SELECT [object] = so.name, [column] = sc.name, 
  [type]  = st.name,   [precision] = st.xprec, 
  [scale] = st.xscale, st.length
FROM sysobjects AS so
INNER JOIN syscolumns AS sc
ON  so.id = sc.id
INNER JOIN systypes AS st
ON sc.xtype = st.xtype
WHERE sc.name IN 
  (N'first', N'fname', N'firstname', N'namef', N'namefirst', N'name')
AND so.name NOT LIKE '#%'
AND OBJECTPROPERTY(so.id, 'IsMsShipped') = 0;

También puede hacer esto para cada base de datos en SQL Server 2000, pero como no puede usar NVARCHAR(MAX) tendrá que usar un cursor, un montón de variables o sp_msforeachdb altamente no recomendado .