sql-server - таблицы - проверить существует ли запись sql




Как проверить, существует ли столбец в таблице SQL Server? (16)

SQL Server 2005 и далее:

IF EXISTS(SELECT 1 FROM sys.columns 
          WHERE Name = N'columnName'
          AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
    -- Column Exists
END

Версия Мартина Смита короче:

IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
    -- Column Exists
END

Мне нужно добавить конкретный столбец, если он не существует. У меня есть что-то вроде следующего, но всегда возвращает false:

IF EXISTS(SELECT *
          FROM   INFORMATION_SCHEMA.COLUMNS
          WHERE  TABLE_NAME = 'myTableName'
                 AND COLUMN_NAME = 'myColumnName') 

Как проверить, существует ли столбец в таблице базы данных SQL Server?


Более сжатая версия

IF COL_LENGTH('table_name','column_name') IS NULL
BEGIN
/* Column does not exist or caller does not have permission to view the object */
END

Вопрос о разрешениях на просмотр метаданных применяется ко всем ответам не только этого.

Обратите внимание, что имя первой таблицы параметров COL_LENGTH может быть в одном, двух или трех форматах имени по COL_LENGTH .

Пример, ссылающийся на таблицу в другой базе данных

COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')

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


Вот простой сценарий, который я использую для управления добавлением столбцов в базе данных:

IF NOT EXISTS (
        SELECT *
        FROM sys.Columns
        WHERE Name = N'QbId'
            AND Object_Id = Object_Id(N'Driver')
        )
BEGIN
    ALTER TABLE Driver ADD QbId NVARCHAR(20) NULL
END
ELSE
BEGIN
    PRINT 'QbId is already added on Driver'
END

В этом примере Name - это имя ColumnName которое нужно добавить, а Object_Id - имя TableName


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

SELECT *
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME = 'yourTableName'
 ORDER BY ORDINAL_POSITION

Вы также можете опросить просмотры, хранимые процедуры и почти что угодно о базе данных, используя представления Information_schema.


Еще одна вариация ...

SELECT Count(*) AS existFlag FROM sys.columns 
WHERE [name] = N'ColumnName' AND [object_id] = OBJECT_ID(N'TableName')

Мне нужен был аналогичный для SQL SERVER 2000, и, как указывает @Mitch, это работает только в 2005 году +.

Если это поможет кому-то еще, это то, что сработало для меня в конце:

if exists (
    select * 
    from 
        sysobjects, syscolumns 
    where 
        sysobjects.id = syscolumns.id 
        and sysobjects.name = 'table' 
        and syscolumns.name = 'column')

Одним из самых простых и понятных решений является:

IF COL_LENGTH('Table_Name','Column_Name') IS NULL
 BEGIN
    -- Column Not Exists, implement your logic
 END 
ELSE
 BEGIN
    -- Column Exists, implement your logic
 END

Ответ Пшеницы хорош, но предполагает, что у вас нет одинаковых имен имен таблиц / столбцов в любой схеме или базе данных. Чтобы сделать это безопасным для этого условия, используйте это ...

select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
  and Table_Schema = 'SchemaName'
  and Table_Name = 'TableName'
  and Column_Name = 'ColumnName'

Попробуй это

SELECT COLUMNS.*
FROM   INFORMATION_SCHEMA.COLUMNS COLUMNS,
       INFORMATION_SCHEMA.TABLES TABLES
WHERE  COLUMNS.TABLE_NAME = TABLES.TABLE_NAME
       AND Upper(COLUMNS.COLUMN_NAME) = Upper('column_name') 

Попробуй это...

IF NOT EXISTS(
  SELECT TOP 1 1
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE 
    [TABLE_NAME] = 'Employees'
    AND [COLUMN_NAME] = 'EmployeeID')
BEGIN
  ALTER TABLE [Employees]
    ADD [EmployeeID] INT NULL
END

Сначала проверьте, существует ли комбинация table / column ( id / name ) в dbo.syscolumns (внутренняя таблица SQL Server, которая содержит определения полей), и если не выдает соответствующий запрос ALTER TABLE чтобы добавить его. Например:

IF NOT EXISTS ( SELECT  *
            FROM    syscolumns
            WHERE   id = OBJECT_ID('Client')
                    AND name = 'Name' ) 
ALTER TABLE Client
ADD Name VARCHAR(64) NULL

Существует несколько способов проверить наличие столбца. Я настоятельно рекомендую использовать INFORMATION_SCHEMA.COLUMNS поскольку он создан для связи с пользователем. Рассмотрим следующие таблицы:

 sys.objects
 sys.columns

и даже некоторые другие методы доступа, доступные для проверки system catalog.

Кроме того, нет необходимости использовать SELECT * , просто проверьте его с помощью NULL value

IF EXISTS(
           SELECT NULL 
           FROM INFORMATION_SCHEMA.COLUMNS
           WHERE
             TABLE_NAME = 'myTableName'
             AND COLUMN_NAME = 'myColumnName'
         ) 

Это работало для меня в SQL 2000:

IF EXISTS 
(
    SELECT * 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'table_name' 
    AND column_name = 'column_name'
)
BEGIN
...
END

Я бы предпочел INFORMATION_SCHEMA.COLUMNS над системной таблицей, потому что Microsoft не гарантирует сохранение системных таблиц между версиями. Например, dbo.syscolumns все еще работает в SQL 2008, но он устарел и может быть удален в любое время в будущем.


declare @myColumn   as nvarchar(128)
set @myColumn = 'myColumn'
if not exists (
    select  1
    from    information_schema.columns columns 
    where   columns.table_catalog   = 'myDatabase'
        and columns.table_schema    = 'mySchema' 
        and columns.table_name      = 'myTable' 
        and columns.column_name     = @myColumn
    )
begin
    exec('alter table myDatabase.mySchema.myTable add'
    +'    ['[email protected]+'] bigint       null')
end

if exists (select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='<table_name>' and COLUMN_NAME='<column_name>')
  begin
    print 'Column you have specified exists'
  end
else
  begin
    print 'Column does not exists'
  end




sql-server-2016