Soru Eklemeden önce genişletilmiş özellik açıklamasının mevcut olup olmadığını kontrol edin


Yani, bazı özellikleri bir sütun açıklayan bir tablo açıklayan, genişletilmiş özellikler ekler bir komut dosyası var. Genişletilmiş özelliği ekleyemeden önce komut dosyasının bir hata atmamasını nasıl kontrol edebilirim?


25
2018-06-18 15:44


Menşei




Cevaplar:


İlk komut, tabloyu açıklayan özelliklerin mevcut olup olmadığını kontrol eder:

IF NOT EXISTS (SELECT NULL FROM SYS.EXTENDED_PROPERTIES WHERE [major_id] = OBJECT_ID('Table_Name') AND [name] = N'MS_Description' AND [minor_id] = 0)
EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'This table is responsible for holding information.', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'Table_Name';

Bu ikinci komut dosyası, sütunu açıklayan genişletilmiş özellik olup olmadığını kontrol eder:

IF NOT EXISTS (SELECT NULL FROM SYS.EXTENDED_PROPERTIES WHERE [major_id] = OBJECT_ID('Table_Name') AND [name] = N'MS_Description' AND [minor_id] = (SELECT [column_id] FROM SYS.COLUMNS WHERE [name] = 'Column_Name' AND [object_id] = OBJECT_ID('Table_Name')))
EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'This column is responsible for holding information for table Table_Name.', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'Table_Name', @level2type = N'COLUMN', @level2name = N'Column_Name';

44
2018-06-18 15:44



Bu, sorunuzla birleştirilmelidir. - Hart CO
"Soru Sor" u seçtiğinizde "Kendi sorunuzu cevaplayın - bilginizi, Soru ve Cevap stilinizi paylaşın" seçeneğine sahipsiniz. Çözümü araştırırken bana benzeyen bir soru bulamadığım için yaptığım şey buydu. - ScubaSteve
Ah, anladım, daha önce bunu yapan insanlar görmedim. - Hart CO
Genel olarak, en azından tarihsel olarak, soru / cevap değer sağlaması koşuluyla SO buna izin verdi. Onlar başkalarının da cevap izin kendi cevap kabul etmeden önce biraz zaman sağladığını ve objektif olarak en iyi cevabı, sadece + rep almak için doğru olarak kendi yanıt işaretleme değil seçmeniz, inanıyorum, soruyorsun. Yani bu iyi, tek endişe, insanların kendi cevaplarını kabul etmeden önce başkalarına bir cevap vermek için zaman vermemesidir. - DavidScherer


Burada, Ruslan K.'lara benzer bir başka saklı prosedür yaklaşımı var, ancak bu, deneme / yakalama veya açık işlemler içermiyor:

-- simplify syntax for maintaining data dictionary

IF OBJECT_ID ('dbo.usp_addorupdatedescription', 'P') IS NOT NULL
    DROP PROCEDURE dbo.usp_addorupdatedescription;
GO

CREATE PROCEDURE usp_addorupdatedescription
        @table nvarchar(128),  -- table name
        @column nvarchar(128), -- column name, NULL if description for table
        @descr sql_variant     -- description text
AS
    BEGIN
        SET NOCOUNT ON;

        IF @column IS NOT NULL
            IF NOT EXISTS (SELECT NULL FROM SYS.EXTENDED_PROPERTIES
            WHERE [major_id] = OBJECT_ID(@table) AND [name] = N'MS_Description'
                  AND [minor_id] = (SELECT [column_id]
                                    FROM SYS.COLUMNS WHERE [name] = @column AND [object_id] = OBJECT_ID(@table)))
                EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = @descr,
                                               @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE',
                                               @level1name = @table, @level2type = N'COLUMN', @level2name = @column;
            ELSE
                EXECUTE sp_updateextendedproperty @name = N'MS_Description',
                                                  @value = @descr, @level0type = N'SCHEMA', @level0name = N'dbo',
                                                  @level1type = N'TABLE', @level1name = @table,
                                                  @level2type = N'COLUMN', @level2name = @column;
        ELSE
            IF NOT EXISTS (SELECT NULL FROM SYS.EXTENDED_PROPERTIES
            WHERE [major_id] = OBJECT_ID(@table) AND [name] = N'MS_Description'
                  AND [minor_id] = 0)
                EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = @descr,
                                               @level0type = N'SCHEMA', @level0name = N'dbo',
                                               @level1type = N'TABLE', @level1name = @table;
            ELSE
                EXECUTE sp_updateextendedproperty @name = N'MS_Description', @value = @descr,
                                                  @level0type = N'SCHEMA', @level0name = N'dbo',
                                                  @level1type = N'TABLE', @level1name = @table;
    END
GO

4
2017-07-22 14:19





Genişletilmiş özellik 'MS_Description' eklemek veya güncellemek için basit saklı yordam yazdım:

IF OBJECT_ID ('dbo.usp_addorupdatedescription', 'P') IS NOT NULL
    DROP PROCEDURE dbo.usp_addorupdatedescription;
GO

CREATE PROCEDURE usp_addorupdatedescription
    @table nvarchar(128),  -- table name
    @column nvarchar(128), -- column name, NULL if description for table
    @descr sql_variant     -- description text
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @c nvarchar(128) = NULL;

    IF @column IS NOT NULL
        SET @c = N'COLUMN';

    BEGIN TRY
        EXECUTE sp_updateextendedproperty  N'MS_Description', @descr, N'SCHEMA', N'dbo', N'TABLE', @table, @c, @column;
    END TRY
    BEGIN CATCH
        EXECUTE sp_addextendedproperty N'MS_Description', @descr, N'SCHEMA', N'dbo', N'TABLE', @table, @c, @column;
    END CATCH;
END
GO

3
2017-11-23 10:34



Ben ancak ben bu sorguyu yürüttükten sonra Açık İşlemler yaşıyorum örneğine rastladım bu vardır yaklaşım gibi. `` `Msg 266, Level 16, State 2, Prosedür up_DataDict, Hat sonra UYGULA 178 İşlem sayısı BEGIN ve COMMIT tabloların bir uyumsuzluğunun sayısını gösterir. Önceki sayı = 0, akım sayısı = 1. `` ` - Damian
Aşağıdakine benzer bir yaklaşım yayınladım. Bu, try / catch, transaction rollbacks (şık olarak değil, Damian tarafından dile getirilen endişelerden kaçınıyor). - Brian Westrich
İşe yarar. Bununla birlikte, program akışını kontrol etmek için istisnai kullanımın kullanılması (yani bir IF beyanı ile ne yapılabilir), kod kokusu!. Bunu gör stackoverflow sorusu. - DaveBoltman
.. ve bu - DaveBoltman


Verilen tablo için mevcut genişletilmiş özelliklerden herhangi birini aşağıdaki gibi kullanmak için kullanın.

IF EXISTS(SELECT 1 FROM sys.extended_properties WHERE [major_id] = OBJECT_ID('<schema>.<table_name>') AND [name] = N'MS_Description')

Tablonuzda birden fazla genişletilmiş mülk varsa, sütunu minor_id.

IF EXISTS(SELECT 1 FROM sys.extended_properties WHERE [major_id] = OBJECT_ID('<schema>.<table_name>') AND [name] = N'MS_Description' AND minor_id = 3)

Sorgu sys.extended_properties Veritabanınızdaki tüm genişletilmiş özellikleri almak için katalog görünümü.

Daha fazla bilgi için http://msdn.microsoft.com/en-us/library/ms177541(v=sql.110).aspx


1
2017-08-08 06:02