Am nevoie pentru a adăuga într-o anumită coloană, dacă aceasta nu există. Am ceva, cum ar fi următoarele, dar întotdeauna se întoarce false:
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
Cum pot verifica dacă o coloană există într-un tabel al bazei de date SQL Server?
SQL Server 2005 încoace:
IF EXISTS(SELECT 1 FROM sys.columns
WHERE Name = N'columnName'
AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
-- Column Exists
END
Martin Smith's version este mai scurt:
IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
-- Column Exists
END
O mai concis versiune
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
Ideea despre permisiunile de vizualizare metadate se aplică la toate raspunsurile nu doar asta.
Rețineți că primul parametru nume de tabel a COL_LENGTH
poate fi în una, două, sau trei piese, format după cum este necesar.
Un exemplu referire la o masă într-o altă bază de date este
COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')
O diferență cu acest răspuns în comparație cu utilizarea de metadate vedere este că metadatele funcții, cum ar fi COL_LENGTH
întotdeauna reveni doar date despre angajat modificări, indiferent de nivelul de izolare în vigoare.
Tweak de mai jos pentru a se potrivi cu cerințele dumneavoastră specifice:
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 de-a face cu edit la întrebare: Care ar trebui să funcționeze - să ia o privire atentă asupra codului pentru greșeli stupide; ești interogarea INFORMATION_SCHEMA pe aceeași bază de date ca introduce este aplicat, de exemplu? Ai un typo la masa ta/numele coloanei în orice declarație?
Am'd prefer INFORMATION_SCHEMA.COLOANE pentru un sistem de masă, deoarece Microsoft nu garantează pentru a păstra sistemul de tabele între versiuni. De exemplu,
dbo.syscolumns` nu încă de lucru în SQL 2008, dar's învechită și ar putea fi eliminate în orice moment în viitor.
Puteți utiliza informațiile schema sistemului de vederi pentru a afla ceva destul de mult despre mese're interesat în:
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
ORDER BY ORDINAL_POSITION
Puteți interoga, de asemenea, vederi, proceduri stocate și ceva destul de mult despre baza de date folosind Information_schema vedere.
Pentru oamenii care se uită la coloana existența să-l picătură.
De la SQL Server 2016 puteți utiliza noul MOR declarații în loc de mare "DACĂ" ambalaje
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
Verifica mai intai daca masa
/coloana
(id
/nume
) combinație există în dbo.syscolumns
(un SQL Server intern tabel, care conține definiții de câmp), și dacă nu emite corespunzătoare ALTER TABLE
interogare pentru a adăuga. De exemplu:
IF NOT EXISTS ( SELECT *
FROM syscolumns
WHERE id = OBJECT_ID('Client')
AND name = 'Name' )
ALTER TABLE Client
ADD Name VARCHAR(64) NULL
Incearca ceva de genul:
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
Apoi să-l utilizați ca aceasta:
IF ColumnExists('xxx', 'yyyy') = 'F'
BEGIN
ALTER TABLE xxx
ADD yyyyy varChar(10) NOT NULL
END
GO
Acesta ar trebui să funcționeze pe ambele SQL Server 2000 & SQL Server 2005. Nu sunt sigur despre SQL Server 2008, dar don't văd de ce nu.
Un bun prieten și coleg de-al meu mi-a arătat cum puteți utiliza, de asemenea, un "DACĂ" bloc cu funcțiile SQL `OBJECT_ID " și " COLUMNPROPERTY în SQL SERVER 2005+ pentru a verifica pentru o coloană. Puteți folosi ceva similar cu următorul:
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
Am nevoie similare pentru SQL SERVER 2000 și, ca @Mitch subliniază, acest lucru funcționează doar inm 2005+.
Ar trebui să-l ajute pe oricine altcineva, acest lucru este ceea ce a lucrat pentru mine în cele din urmă:
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;
Un tabel temp versiune a răspunsul acceptat:
if (exists(select 1
from tempdb.sys.columns
where Name = 'columnName'
and Object_ID = object_id('tempdb..#tableName')))
begin
...
end
Grâu's răspunsul este bun, dar se presupune că nu au nici identice masa de nume / nume de coloană de perechi în orice schemă sau baze de date. Pentru a face în condiții de siguranță pentru starea asta a folosi acest...
select *
from Information_Schema.Columns
where Table_Catalog = 'DatabaseName'
and Table_Schema = 'SchemaName'
and Table_Name = 'TableName'
and Column_Name = 'ColumnName'
Există mai multe modalități de a verifica existența de pe o coloana.
Mi-ar recomandăm să utilizați INFORMATION_SCHEMA.COLOANE
așa cum este creată în scopul de a comunica cu utilizatorul.
Luați în considerare următoarele tabele:
sys.objects
sys.columns
și chiar și unele alte metode de acces disponibile pentru a verifica sistemul de catalog.`
De asemenea, nu trebuie să utilizați SELECT *
, pur și simplu test este de valoare NULĂ
IF EXISTS(
SELECT NULL
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName'
)