2013-09-26 8 views

Odpowiedz

21

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!

+0

Tego właśnie potrzebuję. Dziękuję Ci. –

+4

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 ... –

+0

dobry przykład .. Nauczyłem się czegoś nowego w sql2012 –

8

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

sql fiddle demo

1

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 
1

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 
0

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;