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 | +---------------+