W tym artykule przedstawiono trzy sposoby wykorzystania T-SQL do sprawdzenia, czy kolumna jest kolumną obliczaną w SQL Server.
Dotyczy to sytuacji, gdy znasz nazwę kolumny, ale nie wiesz, czy jest to kolumna wyliczana.
Funkcja COLUMNPROPERTY()
COLUMNPROPERTY()
funkcja zwraca informacje o danej kolumnie.
Jedna z właściwości akceptowanych jako argument przez tę funkcję nazywa się IsComputed
. Otrzymasz 1, jeśli kolumna jest obliczona, a 0, jeśli nie.
SELECT COLUMNPROPERTY( OBJECT_ID('dbo.Products'), 'TotalValue', 'IsComputed') AS [Computed Column?];
Wynik:
+--------------------+ | Computed Column? | |--------------------| | 1 | +--------------------+
W tym przypadku sprawdziłem, czy TotalValue
kolumna jest kolumną obliczaną, a wynikiem jest 1
, co oznacza, że jest to kolumna wyliczana.
Widok katalogu systemu sys.computed_columns
sys.computed_columns
widok katalogu systemowego zawiera jeden wiersz dla każdej obliczonej kolumny w bazie danych. Dlatego możesz zapytać o ten widok, aby sprawdzić, czy Twoja kolumna jest obliczona.
SELECT is_computed AS [Computed Column?] FROM sys.computed_columns WHERE name = 'TotalValue';
Wynik:
+--------------------+ | Computed Column? | |--------------------| | 1 | +--------------------+
Możesz również użyć tego widoku, jeśli znasz tylko nazwę tabeli. Jeśli nie znasz nazwy kolumny, ale po prostu próbujesz dowiedzieć się, czy tabela zawiera kolumnę obliczeniową, możesz zrobić coś takiego:
SELECT name AS [Computed Column] FROM sys.computed_columns WHERE object_id = OBJECT_ID('dbo.Products');
Wynik:
+-------------------+ | Computed Column | |-------------------| | TotalValue | +-------------------+
W tym przypadku wiedziałem, że nazwa tabeli to Products
, więc użyłem OBJECT_ID()
aby uzyskać jego identyfikator i dopasować go do object_id
kolumna (jest to identyfikator obiektu, do którego należy kolumna).
W tych przykładach zwracam tylko jedną kolumnę. Jak w przypadku każdego widoku, możesz zwrócić dowolną liczbę kolumn. Jedna z kolumn z tego widoku zawiera definicję kolumny wyliczanej. Oto zapytanie, które zwraca wszystkie kolumny.
SELECT * FROM sys.computed_columns WHERE name = 'TotalValue';
Wynik (przy użyciu wyjścia pionowego):
object_id | 814625945 name | TotalValue column_id | 5 system_type_id | 60 user_type_id | 60 max_length | 8 precision | 19 scale | 4 collation_name | NULL is_nullable | 1 is_ansi_padded | 0 is_rowguidcol | 0 is_identity | 0 is_filestream | 0 is_replicated | 0 is_non_sql_subscribed | 0 is_merge_published | 0 is_dts_replicated | 0 is_xml_document | 0 xml_collection_id | 0 default_object_id | 0 rule_object_id | 0 definition | ([Quantity]*[Price]) uses_database_collation | 1 is_persisted | 1 is_computed | 1 is_sparse | 0 is_column_set | 0 generated_always_type | 0 generated_always_type_desc | NOT_APPLICABLE encryption_type | NULL encryption_type_desc | NULL encryption_algorithm_name | NULL column_encryption_key_id | NULL column_encryption_key_database_name | NULL is_hidden | 0 is_masked | 0 graph_type | NULL graph_type_desc | NULL
Widok katalogu systemu sys.columns
sys.computed_columns
widok faktycznie dziedziczy swój is_computed
kolumna (i kilka innych kolumn) z sys.columns
. Dlatego możesz również użyć sys.columns
aby sprawdzić, czy kolumna jest kolumną wyliczaną.
SELECT is_computed FROM sys.columns WHERE name = 'TotalValue';
Wynik:
+---------------+ | is_computed | |---------------| | 1 | +---------------+