Potrzebuję utworzyć skrypt SQL, aby określić, czy sekwencja istnieje w bazie danych SQL Server 2012. Jestem zaznajomiony z procesem dla określenia, czy procedura przechowywana istnieje, ale nie sekwencja. Dziękuję Ci.Jak określić, czy sekwencja istnieje w SQL Server 2012?
Odpowiedz
Scenariusz określający, czy sekwencja ma istnieć, czy nie ts w SQL Server 2012 jest bardzo podobny do sprawdzania procedur przechowywanych. Rozważmy następujący kod, który sprawdza, czy procedury przechowywanej istnieje:
SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[SProc_Name]') AND type IN (N'P', N'PC')
Wartości „P” i „PC” dla typu określić typ sys.object jest SQL procedury przechowywanej lub zespół (CLR) procedura składowana. Aby sprawdzić sekwencji, po prostu trzeba go zmienić na „TAK”, co wskazuje, że jest to obiekt sekwencji:
SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[Sequence_Name]') AND type = 'SO'
Na przykład, jeśli chcesz stworzyć Sequence jeśli nie istnieje, można użyj następującego kodu:
IF NOT EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Sequence_Name]') AND type = 'SO')
CREATE SEQUENCE [dbo].[Sequence_Name]
AS [bigint]
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 3
GO
Mam nadzieję, że to pomoże!
Sprawdzając dane w sys.sequences tabeli:
select *
from sys.sequences
where object_id = object_id('schema_name.sequence_name')
faktycznie, że jeśli jesteś pewien, że nie ma żadnego obiektu inny niż sekwencji z nazwy równa 'schema_name.sequence_name'
, można po prostu sprawdzić object_id('schema_name.sequence_name') is not null
Spróbuj tego. Spowoduje to wyświetlenie wszystkich sekwencji dla danej bazy danych.
SELECT
seq.name AS [Sequence Name],
seq.object_id AS [Object ID],
seq.create_date AS [Creation Date],
seq.modify_date AS [Last Modified Date],
SCHEMA_NAME(seq.schema_id) AS [Schema],
CAST(seq.precision AS int) AS [Numeric Precision],
CAST(seq.scale AS int) AS [Numeric Scale],
ISNULL(seq.start_value,N'''') AS [Start Value],
ISNULL(seq.increment,N'''') AS [Increment Value],
ISNULL(seq.minimum_value,N'''') AS [Min Value],
ISNULL(seq.maximum_value,N'''') AS [Max Value],
CAST(seq.is_cycling AS bit) AS [Is Cycle Enabled],
ISNULL(seq.cache_size,0) AS [Cache Size],
ISNULL(seq.current_value,N'''') AS [Current Value]
FROM sys.sequences AS seq
Jest to kolejna wersja skrót od Tim S:
IF OBJECT_ID('schema_name.sequence_name', 'SO') IS NOT NULL
BEGIN
DROP SEQUENCE schema_name.sequence_name
END
Używam SQL Server 17.4 (najnowsza wersja MS SQL Sever) i ten kod działa ze mną. Ten kod tworzy na przykład sekwencję, jeśli nie istnieje.
IF NOT EXISTS
(
SELECT [name]
FROM sys.sequences
WHERE [name] = 'seq_businessTripRequest'
)
BEGIN
CREATE SEQUENCE [dbo].[seq_businessTripRequest]
AS [BIGINT]
START WITH 1
INCREMENT BY 1
MINVALUE-9223372036854775808
MAXVALUE 9223372036854775807
CACHE;
END;
Tego właśnie potrzebuję. Dziękuję Ci. –
Od wersji SQL Server 2005 lepiej jest używać widoków ** bardziej skupionych ** katalogów, takich jak 'sys.sequences', zamiast pytać o" catch-all "' sys.objects' i pamiętać o niezbędnym 'type' dla twojego obiektu ... –
dobry przykład .. Nauczyłem się czegoś nowego w sql2012 –