sql >> Database >  >> RDS >> Sqlserver

Kolomnamen selecteren uit meerdere tabellen in SQL Server 2000-2008 die in een reeks namen staan

Voor SQL Server 2005 en hoger

FWIW voor nieuwere versies van SQL Server Ik geef de voorkeur aan de catalogusweergaven boven INFORMATION_SCHEMA om de redenen die in deze blogpost worden beschreven:

De zaak tegen INFORMATION_SCHEMA weergaven

Zie ook waarschuwingen zoals deze over het onderwerp TABELLEN (Transact-SQL) op MSDN:

Dus de vraag die ik zou gebruiken zou als volgt zijn (systeemobjecten uitfilteren en ook #temp-tabellen vermijden in het geval dat je in tempdb bent):

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 '#%';

Om dit voor alle databases te herhalen:

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;

(De COLLATE clausules zijn er om fouten te voorkomen in het geval u databases met verschillende sorteringen heeft.)

Voor SQL Server 2000

Merk op dat het bovenstaande niet helpt voor SQL Server 2000, maar ik denk niet dat je er een doel van moet maken om dezelfde query op elke afzonderlijke versie uit te voeren. SQL Server 2000 is 13 jaar oud en wordt al enkele jaren niet meer ondersteund; je kunt zeker rechtvaardigen dat je er een speciale code voor hebt. In dat geval zou ik nog steeds de zoekopdracht kiezen die je hebt over INFORMATION_SCHEMA , filter er gewoon systeemobjecten en tijdelijke tabellen uit (opnieuw, alleen relevant als je in tempdb zit):

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;

U kunt dit ook voor elke database in SQL Server 2000 doen, maar aangezien u NVARCHAR(MAX) niet kunt gebruiken je zult ofwel een cursor moeten gebruiken, een heleboel variabelen, of de sterk af te raden sp_msforeachdb .



  1. MySQL:voorwaarde op resultaat van GROUP_CONCAT?

  2. maak alle auto-increment integers hetzelfde aantal cijfers met voorloopnullen

  3. Verwijder rijen uit tabel, behalve opgegeven aantal (limiet aantal rijen)

  4. MySQL Statische Hash-index