Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да изберете имена на колони от множество таблици в SQL Server 2000-2008, които са в набор от имена

За SQL Server 2005 и по-нова версия

FWIW за по-нови версии на SQL Server Предпочитам каталожните изгледи пред INFORMATION_SCHEMA поради причините, посочени в тази публикация в блога:

Делото срещу INFORMATION_SCHEMA показвания

Вижте също предупреждения като това по темата ТАБЛИЦИ (Transact-SQL) на MSDN:

Така че заявката, която бих използвал, ще бъде както следва (филтриране на системни обекти и избягване на #temp таблици в случай, че сте в 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 '#%';

За да повторите това за всички бази данни:

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 клаузите са там, за да предотвратят грешки в случай, че имате бази данни с различни съпоставки.)

За SQL Server 2000

Имайте предвид, че горното не помага за SQL Server 2000, но не мисля, че трябва да си поставите за цел да можете да изпълнявате една и съща заявка за всяка отделна версия. SQL Server 2000 е на 13 години и няколко години няма поддръжка; със сигурност можете да оправдаете наличието на специален код за него. В който случай пак бих избрал заявката, която имате пред INFORMATION_SCHEMA , просто филтрирайте системни обекти и временни таблици (отново, уместно само в случай, че сте в 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;

Можете да направите това и за всяка база данни в SQL Server 2000, но тъй като не можете да използвате NVARCHAR(MAX) ще трябва или да използвате курсор, куп променливи или силно не се препоръчва sp_msforeachdb .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да отстраните грешки в SQL Server T-SQL във Visual Studio 2012

  2. 4 начина да получите списък с графици в SQL Server Agent (T-SQL)

  3. Преместване на бази данни на SQL Server в облака

  4. Дублиращи се записи с различно времево клеймо

  5. Алтернатива за оператор MAX върху битови полета