sql >> Databáze >  >> RDS >> Sqlserver

Jak vybrat názvy sloupců z více tabulek v SQL Server 2000-2008, které jsou v sadě názvů

Pro SQL Server 2005 a vyšší

FWIW pro novější verze SQL Server Preferuji zobrazení katalogu před INFORMATION_SCHEMA z důvodů uvedených v tomto příspěvku na blogu:

Případ proti INFORMATION_SCHEMA zobrazení

Podívejte se také na varování podobná tomuto k tématu TABLES (Transact-SQL) na MSDN:

Takže dotaz, který bych použil, by byl následující (filtrování systémových objektů a také vyhýbání se tabulkám #temp v případě, že jste v 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 '#%';

Postup opakování pro všechny databáze:

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;

(COLLATE klauzule jsou zde proto, aby zabránily chybám v případě, že máte databáze s různým řazením.)

Pro SQL Server 2000

Všimněte si, že výše uvedené nepomáhá pro SQL Server 2000, ale nemyslím si, že byste si měli stanovit cíl, abyste mohli spustit stejný dotaz na každé jednotlivé verzi. SQL Server 2000 je 13 let starý a několik let bez podpory; jistě můžete ospravedlnit speciální kód pro to. V takovém případě bych stále zvolil dotaz, který máte nad INFORMATION_SCHEMA , stačí odfiltrovat systémové objekty a dočasné tabulky (opět relevantní pouze v případě, že jste v databázi 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;

Můžete to udělat pro každou databázi v SQL Server 2000, ale protože nemůžete použít NVARCHAR(MAX) buď budete muset použít kurzor, spoustu proměnných nebo velmi nedoporučované sp_msforeachdb .



  1. Jak aktualizovat data z datatable do sql tabulky?

  2. Jaký typ ovladače JDBC bych měl použít pro přístup k databázi Oracle?

  3. Jak zajistit záznamy s nepřekrývajícími se časovými rozsahy?

  4. Vytváření názvů tabulek, které jsou vyhrazenými slovy/klíčovými slovy v MS SQL Server