Динамическое определение имени таблицы по имени поля в SQL-сервере - PullRequest
1 голос
/ 07 мая 2010

Странная ситуация: я пытаюсь удалить жесткое кодирование из моего кода. Есть ситуация, когда у меня есть поле, скажем «CityID», и, используя эту информацию, я хочу выяснить, в какой таблице содержится первичный ключ с именем CityID.

Логично, вы бы сказали, что это, вероятно, таблица под названием "Город", но это не ... эта таблица называется "Города". Существуют и другие несоответствия в именах баз данных, поэтому я никогда не могу быть уверен, будет ли достаточно удаления строки «ID» и выяснения множественного числа.

Примечание. Как только я выясню, что CityID ссылается на таблицу под названием Cities, я выполню объединение, чтобы заменить CityID названием города на лету. Я буду признателен, если кто-нибудь также скажет мне, как найти первое поле varchar в таблице с его именем.

Ответы [ 5 ]

4 голосов
/ 07 мая 2010
SELECT name FROM sysobjects 
WHERE id IN ( SELECT id FROM syscolumns WHERE name = 'THE_COLUMN_NAME' )

Чтобы получить информацию о столбце из указанной таблицы:

SELECT column_name, data_type, character_maximum_length 
FROM information_schema.columns
WHERE table_name = 'myTable'
3 голосов
/ 07 мая 2010

выберите имя_таблицы из столбца information_schema.columns, где column_name = 'CityID'

2 голосов
/ 07 мая 2010

Вы можете использовать таблицы INFORMATION_SCHEMA для чтения метаданных о базе данных.

SELECT 
     TABLE_NAME 
FROM 
     [db].[INFORMATION_SCHEMA].[COLUMNS]
WHERE 
     COLUMN_NAME='CityID';

Чтобы узнать, что находится в INFORMAITON_SCHEMA, см. INFORMATION_SCHEMA, карту вашей базы данных

1 голос
/ 07 мая 2010

Вся запрашиваемая информация доступна в представлениях информационной схемы . Обратите внимание, что вы найдете много источников, рассказывающих о том, как напрямую запрашивать базовые системные таблицы, к которым относятся эти представления, - и я должен признать, что я делаю то же самое, когда просто что-то быстро выясняю, - но рекомендуемый путь для приложений - это пойти через эти взгляды.

Например, чтобы найти столбец CityID:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'CityID'

Чтобы найти первое varchar поле в таблице:

SELECT TOP 1 * FROM INFORMATION_SCHEMA.COLUMNS WHERE
    TABLE_NAME = 'TableName'
    AND DATA_TYPE = 'varchar'    -- This is off the top of my head!
ORDER BY ORDINAL_POSITION
0 голосов
/ 06 октября 2018

Как я понял из вашего вопроса, вы хотите найти таблицы, которые содержат столбец CITYID в первичном ключе

Вы можете использовать системные представления SQL Server, такие как sysindexes и sysindexkeys, как показано в учебном руководстве по SQL для запроса первичных ключей таблицы базы данных , включая составных первичных ключей , которые сформированы

SELECT
  TBL.name as TableName
FROM sysobjects as PK
INNER JOIN sys.objects as TBL
  on TBL.object_id = PK.parent_obj
INNER JOIN sysindexes as IND
  on IND.name = PK.name AND
  IND.id = TBL.object_id
INNER JOIN SysIndexKeys as KEYS
  on KEYS.id = IND.id AND
  KEYS.indid = IND.indid
INNER JOIN syscolumns as COL
  on COL.id = KEYS.id AND
  COL.colid = KEYS.colid
WHERE
  PK.xtype = 'PK' AND
  COL.name = 'CityID'
...