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?
COL_LENGTH('AdventureWorks2012.HumanResources.Department ','ModifiedDate')
działa dobrze.EXEC sp_executesql
sformatowanejUPDATE
instrukcji.FROM [YourDatabase].INFORMATION_SCHEMA.COLUMNS
Odpowiedzi:
SQL Server 2005 i nowsze:
Wersja Martina Smitha jest krótsza:
źródło
sys.columns
Alter table Table_Name Add [ColumnName] NVarchar(max) NULL; Select COL_LENGTH('[TABLE_NAME]', '[COLUMN_NAME]')
COL_LENGTH
należy przytoczyć. Jest teoretycznie możliwe, że ktoś utworzy kolumnę, która faktycznie ma nazwę[COLUMN_NAME]
- np.CREATE TABLE #T([[COLUMN_NAME]]] INT); SELECT * FROM #T
I wtedy byłoby niejednoznaczne, gdyby nie była to reguła.Bardziej zwięzła wersja
Punkt dotyczący uprawnień do wyświetlania metadanych dotyczy wszystkich odpowiedzi, nie tylko tej.
Zauważ, że nazwa pierwszej tabeli parametrów
COL_LENGTH
może mieć format jednej, dwóch lub trzech nazw części, zależnie od potrzeb.Przykładem odniesienia do tabeli w innej bazie danych jest
Jedną różnicą w porównaniu z tą odpowiedzią w porównaniu do korzystania z widoków metadanych jest to, że funkcje metadanych, takie jak
COL_LENGTH
zawsze, zwracają tylko dane o zatwierdzonych zmianach, niezależnie od obowiązującego poziomu izolacji.źródło
IF OBJECT_ID('TableName','U') IS NULL
do sprawdzenia istnienia obiektu lubDB_ID('foo')
do sprawdzenia istnienia bazy danych.x>>2
zamiastx/4
w C ++. Bardziej szczegółowy kod (if exists (select column_name from information_schema ...)
) zajmuje dużo więcej miejsca, ale nikt nigdy nie podrapałby się po głowie, próbując dowiedzieć się, co on robi.INFORMATION_SCHEMA
widoków lubsys.columns
trafień na dysk, przyCOL_LENGTH
użyciu buforowanych metadanych bazy danych.Dostosuj poniżej, aby dopasować do konkretnych wymagań:
Edytuj, aby poradzić sobie z edycją na pytanie : To powinno zadziałać - uważnie przejrzyj kod pod kątem głupich błędów; czy pytasz na przykład INFORMACJE_SCHEMA w tej samej bazie danych, do której przykładowo stosuje się twoją wstawkę? Czy masz literówkę w nazwie tabeli / kolumny w dowolnej instrukcji?
źródło
Spróbuj tego...
źródło
SELECT 1
zamiastSELECT TOP 1 1
;).EXISTS
instrukcji SQL automatycznie optymalizuje kolumny (podobnie jakcount(*)
), więcSELECT *
wystarczy.and [TABLE_SCHEMA] = '???'
do klauzuli WHERE.Dla osób, które sprawdzają istnienie kolumny, aby ją upuścić.
Z SQL Server 2016 można używać nowych instrukcji DIE zamiast dużych
IF
opakowańźródło
Wolę
INFORMATION_SCHEMA.COLUMNS
tabelę systemową, ponieważ Microsoft nie gwarantuje zachowania tabel systemowych między wersjami. Na przykładdbo.syscolumns
nadal działa w SQL 2008, ale jest przestarzały i może zostać usunięty w dowolnym momencie w przyszłości.źródło
INFORMATION_SCHEMA
widoki zawierają tylko metadane w standardzie ANSI. To jednak wystarcza do testu istnienia.Możesz użyć widoków systemu schematu informacji, aby dowiedzieć się prawie wszystkiego o tabelach, które Cię interesują:
Możesz także przesłuchiwać widoki, procedury składowane i prawie wszystko na temat bazy danych, korzystając z widoków Information_schema.
źródło
Wypróbuj coś takiego:
Następnie użyj go w następujący sposób:
Powinien działać zarówno w SQL Server 2000, jak i SQL Server 2005. Nie jestem pewien co do SQL Server 2008, ale nie wiem dlaczego.
źródło
Najpierw sprawdź, czy istnieje kombinacja
table
/column
(id
/name
)dbo.syscolumns
(wewnętrzna tabela programu SQL Server zawierająca definicje pól), a jeśli nie,ALTER TABLE
wprowadź odpowiednie zapytanie, aby je dodać. Na przykład:źródło
Mój dobry przyjaciel i mój kolega pokazali mi, jak można również użyć
IF
bloku z funkcjami SQLOBJECT_ID
orazCOLUMNPROPERTY
w SQL SERVER 2005+, aby sprawdzić kolumnę. Możesz użyć czegoś podobnego do następującego:Tutaj możesz się przekonać
źródło
COLUMNPROPERTY
tylko.źródło
To działało dla mnie w SQL 2000:
źródło
Spróbuj tego
źródło
INFORMATION_SCHEMA.TABLES
i nie filtrujesz kolumn dla określonej tabeli, więc czasami zwraca więcej niż jeden wiersz dla tych samych nazw kolumn w osobnych tabelach;).Potrzebowałem podobnych dla SQL SERVER 2000 i, jak wskazuje @Mitch, działa to tylko w wersji 2005+.
Jeśli powinno to pomóc komukolwiek innemu, to w końcu zadziałało dla mnie:
źródło
źródło
źródło
Wersja akceptowanej tabeli tymczasowej :
źródło
źródło
Odpowiedź pszenicy jest dobra, ale zakłada, że nie masz identycznych par nazwa tabeli / nazwa kolumny w żadnym schemacie lub bazie danych. Aby zapewnić bezpieczeństwo w tym stanie, użyj tego ...
źródło
Istnieje kilka sposobów sprawdzenia istnienia kolumny. Zdecydowanie polecam używać,
INFORMATION_SCHEMA.COLUMNS
ponieważ jest on tworzony w celu komunikowania się z użytkownikiem. Rozważ następujące tabele:a nawet niektóre inne metody dostępu dostępne do sprawdzenia
system catalog.
Nie musisz też używać
SELECT *
, po prostu przetestujNULL value
źródło
SELECT *
zEXISTS
, bo gdy jest używany istnieje tak naprawdę nie wybrać wszystkie wiersze i wszystkie kolumny wewnętrznie po prostu sprawdza istnienie oraz faktycznie sprawdza wszystkich wierszy i kolumnJednym z najprostszych i zrozumiałych rozwiązań jest:
źródło
Oto prosty skrypt, którego używam do zarządzania dodawaniem kolumn w bazie danych:
W tym przykładzie wykonania,
Name
jest toColumnName
, aby być dodawaneObject_Id
jestTableName
źródło
Poniższe zapytanie może służyć do sprawdzenia, czy przeszukiwana kolumna istnieje w tabeli, czy nie. Możemy podjąć decyzję na podstawie wyszukiwanego wyniku, jak pokazano poniżej.
źródło
Kolejna odmiana ...
źródło
table -> table script as -> new windows - masz skrypt projektowy. sprawdź i znajdź nazwę kolumny w nowych oknach
źródło
Wykonaj poniższe zapytanie, aby sprawdzić, czy kolumna istnieje w podanej tabeli:
źródło
Kolejnym wkładem jest następujący przykład, który dodaje kolumnę, jeśli nie istnieje.
Mam nadzieję, że to pomoże. Simone
źródło
źródło
źródło
Zrób coś, jeśli kolumna nie istnieje:
Zrób coś, jeśli kolumna istnieje:
źródło