Ответ 1
Вы можете использовать подобную конструкцию, используя sys.columns
таблицы -й sys.objects
.
IF NOT EXISTS (
SELECT *
FROM sys.columns
WHERE object_id = OBJECT_ID(N'[dbo].[Person]')
AND name = 'ColumnName'
)
Я хочу написать запрос для MS SQL Server, который добавляет столбец в таблицу. Но я не хочу отображать ошибки, когда я запускаю/выполняю следующий запрос.
Я использую этот тип запроса для добавления таблицы...
IF EXISTS (
SELECT *
FROM sys.objects
WHERE OBJECT_ID = OBJECT_ID(N'[dbo].[Person]')
AND TYPE IN (N'U')
)
Но я не знаю, как написать этот запрос для столбца.
Вы можете использовать подобную конструкцию, используя sys.columns
таблицы -й sys.objects
.
IF NOT EXISTS (
SELECT *
FROM sys.columns
WHERE object_id = OBJECT_ID(N'[dbo].[Person]')
AND name = 'ColumnName'
)
IF COL_LENGTH('table_name', 'column_name') IS NULL
BEGIN
ALTER TABLE table_name
ADD [column_name] INT
END
Другая альтернатива. Я предпочитаю этот подход, потому что он меньше пишет, но они выполняют одно и то же.
IF COLUMNPROPERTY(OBJECT_ID('dbo.Person'), 'ColumnName', 'ColumnId') IS NULL
BEGIN
ALTER TABLE Person
ADD ColumnName VARCHAR(MAX) NOT NULL
END
Я также заметил, что ваш ищет, где существует таблица, которая, очевидно, именно это
if COLUMNPROPERTY( OBJECT_ID('dbo.Person'),'ColumnName','ColumnId') is not null
/* ПРОВЕРИТЬ СУЩЕСТВОВАНИЕ КОЛОНКИ В ТАБЛИЦЕ */
IF COL_LENGTH('TABLE_NAME','COLUMN_NAME') IS NULL
BEGIN
ALTER TABLE .... /*COLUMN DOES NOT EXIST OR CALLER DOES NOT HAVE PERMISSION TO VIEW THE OBJECT*/
END
Вот еще один вариант, который работал для меня.
IF NOT EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE upper(TABLE_NAME) = 'TABLENAME'
AND upper(COLUMN_NAME) = 'COLUMNNAME')
BEGIN
ALTER TABLE [dbo].[Person] ADD Column
END
GO
РЕДАКТИРОВАТЬ: обратите внимание, что представления
INFORMATION_SCHEMA
не всегда могут быть обновлены, вместо этого используйтеSYS.COLUMNS
:
IF NOT EXISTS (SELECT 1 FROM SYS.COLUMNS....
IF NOT EXISTS (SELECT * FROM syscolumns
WHERE ID=OBJECT_ID('[db].[Employee]') AND NAME='EmpName')
ALTER TABLE [db].[Employee]
ADD [EmpName] VARCHAR(10)
GO
Надеюсь, это поможет. Больше информации
IF NOT EXISTS (SELECT 1 FROM SYS.COLUMNS WHERE
OBJECT_ID = OBJECT_ID(N'[dbo].[Person]') AND name = 'DateOfBirth')
BEGIN
ALTER TABLE [dbo].[Person] ADD DateOfBirth DATETIME
END