Jak sprawdzić, czy kolumna istnieje w tabeli SQL Server?
Muszę dodać konkretną kolumnę, jeśli nie istnieje. Mam coś takiego, ale zawsze zwraca false:
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
Jak mogę sprawdzić, czy kolumna istnieje w tabeli bazy danych SQL Server?
23 answers
SQL Server 2005 od:
IF EXISTS(SELECT 1 FROM sys.columns
WHERE Name = N'columnName'
AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
-- Column Exists
END
Wersja Martina Smitha jest krótsza:
IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
-- Column Exists
END
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-12 03:35:20
Bardziej zwięzła wersja
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
Punkt dotyczący uprawnień do wyświetlania metadanych dotyczy wszystkich odpowiedzi nie tylko tej.
Zauważ, że pierwsza nazwa tabeli parametrów to COL_LENGTH
może być w formacie jednej, dwóch lub trzech części, zgodnie z wymaganiami.
Przykład odnoszący się do tabeli w innej bazie danych to
COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')
Jedną z różnic w tej odpowiedzi w porównaniu z używaniem widoków metadanych jest to, że funkcje metadanych, takie jak COL_LENGTH
zawsze zwracają tylko dane o popełnione zmiany niezależnie od obowiązującego poziomu izolacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-08 19:40:22
Dostosuj poniższy tekst, aby odpowiadał Twoim wymaganiom:
if not exists (select
column_name
from
INFORMATION_SCHEMA.columns
where
table_name = 'MyTable'
and column_name = 'MyColumn')
alter table MyTable add MyColumn int
Edit to deal with edit to question: to powinno zadziałać-przyjrzyj się uważnie swojemu kodowi pod kątem głupich błędów; czy zapytujesz INFORMATION_SCHEMA w tej samej bazie danych, do której np. zostanie zastosowana twoja wstawka? Czy masz literówkę w nazwie tabeli/kolumny w którejkolwiek z instrukcji?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-31 08:57:33
Spróbuj tego...
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-14 07:18:51
Wolałbym INFORMATION_SCHEMA.COLUMNS
niż tabelę systemową, Ponieważ Microsoft nie gwarantuje zachowania tabel systemowych między wersjami. Na przykład, dbo.syscolumns
nadal działa w SQL 2008, ale jest przestarzały i może zostać usunięty w dowolnym momencie w przyszłości.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-26 08:58:19
Możesz użyć widoku systemu schematów informacyjnych, aby dowiedzieć się praktycznie wszystkiego o interesujących Cię tabelach:
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
ORDER BY ORDINAL_POSITION
Możesz również przesłuchać widoki, procedury przechowywane i prawie wszystko o bazie danych za pomocą widoków Information_schema.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-25 12:38:35
Najpierw sprawdź, czy table
/column
(id
/name
) kombinacja istnieje w dbo.syscolumns
(wewnętrznej tabeli SQL Server, która zawiera definicje pól), a jeśli nie, wyślij odpowiednie zapytanie ALTER TABLE
, aby je dodać. Na przykład:
IF NOT EXISTS ( SELECT *
FROM syscolumns
WHERE id = OBJECT_ID('Client')
AND name = 'Name' )
ALTER TABLE Client
ADD Name VARCHAR(64) NULL
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 12:29:34
Spróbuj czegoś takiego:
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
Następnie użyj go w ten sposób:
IF ColumnExists('xxx', 'yyyy') = 'F'
BEGIN
ALTER TABLE xxx
ADD yyyyy varChar(10) NOT NULL
END
GO
Powinno działać zarówno na SQL Server 2000 jak i SQL Server 2005. Nie jestem pewien co do SQL Server 2008, ale nie widze czemu nie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 12:27:43
Dla ludzi, którzy sprawdzają istnienie kolumny, aby ją porzucili.
W SQL Server 2016 możesz używać nowych instrukcji DIE zamiast dużych IF
wrapperów
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-01 04:46:00
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-03 15:49:31
Mój dobry przyjaciel i kolega pokazał mi, jak można również użyć bloku IF
Z FUNKCJAMI SQL OBJECT_ID
i COLUMNPROPERTY
w SQL SERVER 2005+, aby sprawdzić kolumnę. Możesz użyć czegoś podobnego do:
Możesz zobaczyć na własne oczy tutaj
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-21 17:27:42
To działało dla mnie w SQL 2000:
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'table_name'
AND column_name = 'column_name'
)
BEGIN
...
END
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-23 19:31:12
Spróbuj tego
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')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-21 14:35:54
Potrzebowałem podobnego dla SQL SERVER 2000 i, jak wskazuje @Mitch, działa to tylko WM 2005+.
Jeśli to komuś pomoże, to w końcu mi się to udało:
if exists (
select *
from
sysobjects, syscolumns
where
sysobjects.id = syscolumns.id
and sysobjects.name = 'table'
and syscolumns.name = 'column')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 07:30:10
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-29 23:44:47
IF NOT EXISTS( SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'tablename'
AND table_schema = 'db_name'
AND column_name = 'columnname') THEN
ALTER TABLE `TableName` ADD `ColumnName` int(1) NOT NULL default '0';
END IF;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-12 12:47:24
select distinct object_name(sc.id)
from syscolumns sc,sysobjects so
where sc.name like '%col_name%' and so.type='U'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-06 15:27:40
A temp table version of the accepted answer :
if (exists(select 1
from tempdb.sys.columns
where Name = 'columnName'
and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:01
ODPOWIEDŹ Wheat ' a jest dobra, ale zakłada, że nie masz żadnych identycznych par nazwa tabeli / nazwa kolumny w żadnym schemacie lub bazie danych. Aby to było bezpieczne dla tego stanu, użyj tego...
select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
and Table_Schema = 'SchemaName'
and Table_Name = 'TableName'
and Column_Name = 'ColumnName'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-26 17:42:36
Jednym z najprostszych i najbardziej zrozumiałych rozwiązań jest:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-24 07:17:40
Oto prosty skrypt, którego używam do zarządzania dodawaniem kolumn w bazie danych:
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
W tym przykładzie Name
jest ColumnName
do dodania, a Object_Id
jest TableName
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-28 04:41:28
Istnieje kilka sposobów sprawdzenia istnienia kolumny.
Zdecydowanie polecam użycie INFORMATION_SCHEMA.COLUMNS
, ponieważ jest on tworzony w celu komunikacji z użytkownikiem.
Rozważmy następujące tabele:
sys.objects
sys.columns
A nawet kilka innych metod dostępu dostępnych do sprawdzenia system catalog.
Również, nie trzeba używać SELECT *
, po prostu przetestuj go przez NULL value
IF EXISTS(
SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName'
)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-28 14:23:07
Kolejna odmiana...
SELECT Count(*) AS existFlag FROM sys.columns
WHERE [name] = N'ColumnName' AND [object_id] = OBJECT_ID(N'TableName')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-10 11:01:43