Also habe ich ein Skript, das erweiterte Eigenschaften hinzufügt, einige beschreiben eine Tabelle, einige beschreiben eine Spalte. Wie kann ich überprüfen, ob die erweiterte Eigenschaft vor dem Hinzufügen vorhanden ist, damit das Skript keinen Fehler verursacht?Überprüfen Sie, ob die Beschreibung der erweiterten Eigenschaft bereits existiert, bevor Sie
Antwort
Diese erste prüft Skript, wenn die erweiterte Eigenschaft, um die Tabelle mit existiert:
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';
Dieses zweite Skript prüft, ob die erweiterte Eigenschaft der Spalte beschreibt, existiert:
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';
einem erweiterten Eigenschaft zu überprüfen das für die angegebene Tabelle verfügbare verwenden Sie wie folgt.
IF EXISTS(SELECT 1 FROM sys.extended_properties WHERE [major_id] = OBJECT_ID('<schema>.<table_name>') AND [name] = N'MS_Description')
Wenn Ihre Tabelle mehr als eine erweiterte Eigenschaft hat, geben die Spalten-ID als 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)
Abfrage sys.extended_properties
Katalogsicht alle erweiterten Eigenschaften in Ihrer Datenbank zu erhalten.
Für weitere Informationen verwenden http://msdn.microsoft.com/en-us/library/ms177541(v=sql.110).aspx
ich einfach gespeicherte Prozedur schrieb hinzuzufügen oder zu aktualisieren erweiterte Eigenschaft ‚MS_Description‘:
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
Ich mag die Methode, die dies hat, aber ich lief in eine Instanz, wo ich offene Transaktionen nach der Ausführung dieser Abfrage habe. '' ' Nachricht 266, Ebene 16, Status 2, Prozedur up_DataDict, Zeile 178 Transaktionsanzahl nach EXECUTE gibt eine nicht übereinstimmende Anzahl von BEGIN- und COMMIT-Anweisungen an. Vorherige Zählung = 0, aktuelle Zählung = 1. '' ' – Damian
Ich postete einen ähnlichen Ansatz unten, der nicht Try/Catch, Transaktion Rollbacks (nicht so elegant, aber vermeidet die Bedenken von Damian –
nützlich die Ausnahmebehandlung zur Steuerung des Programmablaufs (dh was mit einer IF-Anweisung gemacht werden könnte), ist ein [code smell] (https://en.wikipedia.org/wiki/Code_smell)! Siehe hierzu [stackoverflow question] (https: //softwareengineering.stackexchange.com/questions/189222/are-exceptions-as-control-flow-consided-a-serious-antipattern-if-so-why) – DaveBoltman
Hier ist eine andere gespeicherte Prozedur Ansatz, ähnlich wie Ruslan K., aber das beinhaltet keine try/catch oder explizite transaktionen:
-- 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
- 1. BigQuery - Überprüfen, ob die Tabelle bereits existiert
- 2. Überprüfen Sie die Datenbank, ob ein bestimmtes Feld bereits existiert
- 3. Überprüfen Sie, ob die Datei bereits in jquery existiert
- 4. Std :: ofstream, überprüfen Sie, ob die Datei existiert, bevor Sie schreiben
- 5. JSTL: überprüfen, ob die Eigenschaft nicht existiert
- 6. Überprüfen Sie, ob die Website existiert
- 7. Überprüfen Sie, ob die Tabelle existiert
- 8. Überprüfen Sie, ob der WCF-Dienst existiert
- 9. Überprüfen Sie, ob ein Ereignis bereits
- 10. überprüfen Sie, ob eine Eigenschaft in einer Klasse existiert
- 11. Überprüfen Sie, ob eine Eigenschaft in einer JSONB-Spalte existiert
- 12. Überprüfen Sie, ob die Liste der Objekte, die bereits in einer anderen Liste von Objekten existiert
- 13. Überprüfen, ob Realm-Objekt bereits existiert
- 14. Wie überprüfen Sie, ob Datensatz existiert
- 15. Überprüfen Sie, ob eine Datei bereits vorhanden ist, bevor Sie sie mit Alamofire herunterladen + supportedDownloadDestination
- 16. Überprüfen Sie, ob die Funktion in der Klasse vorhanden ist, bevor Sie call_user_func() aufrufen
- 17. Chef-Rezept So überprüfen Sie, ob die Datei existiert
- 18. Überprüfen Sie, ob eine Remote-Datei existiert
- 19. Überprüfen Sie, ob char in Java existiert
- 20. wie überprüfen, ob Objekt existiert bereits in einer Liste
- 21. Knoten - Überprüfen Sie, ob ein Verzeichnis existiert
- 22. Überprüfen Sie, ob eine SQL-Tabelle existiert
- 23. Überprüfen Sie, ob Modellfeld in Django existiert
- 24. Überprüfen, ob die Position existiert
- 25. Überprüfen Sie, ob eine Klasse existiert
- 26. Überprüfen Sie, ob eine Klassenkonstante existiert
- 27. Wie Sie wissen, ob die CloudKit Zone bereits existiert
- 28. überprüfen, ob der Wert existiert
- 29. So überprüfen Sie, ob eine Datei existiert, bevor Sie eine neue Datei erstellen
- 30. Überprüfen Sie, ob die Eigenschaft in Core Data festgelegt ist?
Dies sollte mit Ihrer Frage zusammengeführt werden. –
Wenn Sie "Frage stellen" haben Sie die Option "Beantworten Sie Ihre eigene Frage - teilen Sie Ihr Wissen, Q & A-Stil". Dies habe ich getan, da ich bei der Suche nach der Lösung keine ähnliche Frage wie meine finden konnte. – ScubaSteve
Ah, ich sehe, habe nicht gesehen, dass Leute das vorher machen. –