sql-server - таблицы - проверить существует ли запись sql
Как проверить, существует ли столбец в таблице SQL Server? (16)
Мне нужно добавить конкретный столбец, если он не существует. У меня есть что-то вроде следующего, но всегда возвращает false:
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
Как проверить, существует ли столбец в таблице базы данных SQL Server?
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
Более сжатая версия
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