Мне нужно добавить определенный столбец, если он не существует. У меня есть что-то вроде следующего, но оно всегда возвращает false:
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
Как проверить, существует ли столбец в таблице базы данных SQL Server?
SQL сервер 2005 года:
IF EXISTS(SELECT 1 FROM sys.columns
WHERE Name = N'columnName'
AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
-- Column Exists
END
Мартин Смит's версия короче:
IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
-- Column Exists
END
Более лаконичный вариант
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('AdventureWorks2012.HumanResources.Department','ModifiedDate')
Одно отличие с этим ответом по сравнению с использованием представления метаданных является то, что функции метаданные, такие как `COL_LENGTH всегда возвращать только данные о совершенных изменений, независимо от уровня изоляции в силу.
Настройте приведенные ниже параметры в соответствии с вашими конкретными требованиями:
if not exists (select
column_name
from
INFORMATION_SCHEMA.columns
where
table_name = 'MyTable'
and column_name = 'MyColumn')
alter table MyTable add MyColumn int
Правка для обработки правки вопроса: Это должно работать - внимательно просмотрите свой код на предмет глупых ошибок; например, вы запрашиваете INFORMATION_SCHEMA в той же базе данных, в которую применяется вставка? Нет ли у вас опечатки в имени таблицы/столбца в обоих утверждениях?
Попробуйте...
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
Я'д предпочитаете схемы information_schema.Колонн над системной таблицей, потому что Microsoft не гарантирует сохранения системных таблиц между версиями. Например, ДБО.syscolumns
по-прежнему работает в SQL 2008, но это'ы устаревшим и может быть удален в любое время в будущем.
Вы можете воспользоваться информационной системой представлений схемы, чтобы узнать почти все о таблицах вы'повторно заинтересованы в:
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
ORDER BY ORDINAL_POSITION
Вы также можете допрашивать представления, хранимые процедуры и почти все о базе данных, используя представления information_schema.
Для людей, которые проверяют наличие столбцов, чтобы удалить его.
От сервер SQL 2016 вы можете использовать новые умирать заявления, а не "если" фантики
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
Сначала проверьте, существует ли комбинация 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
Попробуйте что-то вроде:
CREATE FUNCTION ColumnExists(@TableName varchar(100), @ColumnName varchar(100))
RETURNS varchar(1) AS
BEGIN
DECLARE @Result varchar(1);
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName)
BEGIN
SET @Result = 'T'
END
ELSE
BEGIN
SET @Result = 'F'
END
RETURN @Result;
END
GO
GRANT EXECUTE ON [ColumnExists] TO [whoever]
GO
Затем использовать его как это:
IF ColumnExists('xxx', 'yyyy') = 'F'
BEGIN
ALTER TABLE xxx
ADD yyyyy varChar(10) NOT NULL
END
GO
Он должен работать как сервер SQL 2000 & SQL сервер 2005. Не знаете о SQL Server 2008, но Дон'т вижу, почему нет.
Хороший друг и коллега показывал мне, как вы также можете использовать если
блок с функции SQL объект
и функция columnproperty
в SQL сервер 2005+, чтобы проверить столбец. Вы можете использовать что-то похожее на следующее:
IF (OBJECT_ID(N'[dbo].[myTable]') IS NOT NULL AND
COLUMNPROPERTY( OBJECT_ID(N'[dbo].[myTable]'), 'ThisColumnDoesNotExist', 'ColumnId') IS NULL)
BEGIN
SELECT 'Column does not exist -- You can add TSQL to add the column here'
END
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'
+' ['+@myColumn+'] bigint null')
end
Попробуйте это
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')
Мне нужен подобный для SQL Server 2000 и, как @Митч, это работает только инм 2005+.
Это должно помочь кому-то еще, это то, что работал для меня в конце:
if exists (
select *
from
sysobjects, syscolumns
where
sysobjects.id = syscolumns.id
and sysobjects.name = 'table'
and syscolumns.name = 'column')
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 exist'
end
IF NOT EXISTS( SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'TableName'
AND table_schema = 'SchemaName'
AND column_name = 'ColumnName') BEGIN
ALTER TABLE [SchemaName].[TableName] ADD [ColumnName] int(1) NOT NULL default '0';
END;
Временную таблицу версии принято отвечать:
if (exists(select 1
from tempdb.sys.columns
where Name = 'columnName'
and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
Пшеница'ы ответ хороший, но предполагает, что вы не имеют каких-либо идентичных имя таблицы / столбца имя пары в любой схеме или базе данных. Чтобы сделать ее безопасной для этого условия используйте это...
select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
and Table_Schema = 'SchemaName'
and Table_Name = 'TableName'
and Column_Name = 'ColumnName'
Есть несколько способов проверить существование столбца. Я бы настоятельно рекомендуем использовать базы данных information_schema.Колонн как он создан для того, чтобы общаться с пользователем. Рассмотрим следующие таблицы:
sys.objects
sys.columns
и даже некоторые другие доступные методы доступа к проверить системный каталог.`
Кроме того, нет необходимости использовать выберите *
, просто проверить его на пустое значение
IF EXISTS(
SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName'
)