जोड़ने से पहले विस्तारित संपत्ति विवरण पहले से मौजूद है या नहीं, तो मेरे पास एक स्क्रिप्ट है जो विस्तारित गुण जोड़ती है, कुछ तालिका का वर्णन करती हैं, कुछ कॉलम का वर्णन करती हैं। मैं यह कैसे जांच सकता हूं कि विस्तारित संपत्ति इसे जोड़ने से पहले मौजूद है ताकि स्क्रिप्ट कोई त्रुटि न फेंक सके?जांचें कि
उत्तर
यह पहली स्क्रिप्ट जांच करता है कि विस्तारित संपत्ति तालिका का वर्णन मौजूद है:
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';
यह दूसरी स्क्रिप्ट जांच करता है कि विस्तारित संपत्ति स्तंभ का वर्णन मौजूद है:
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';
बढ़ाया संपत्ति के किसी भी जांच करने के लिए जो नीचे दी गई तालिका के उपयोग के लिए उपलब्ध है।
IF EXISTS(SELECT 1 FROM sys.extended_properties WHERE [major_id] = OBJECT_ID('<schema>.<table_name>') AND [name] = N'MS_Description')
अपनी मेज से अधिक विस्तारित संपत्ति है, तो 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)
क्वेरी sys.extended_properties
कैटलॉग देखें अपने डेटाबेस में सभी विस्तारित गुण प्राप्त करने के लिए।
अधिक जानकारी का उपयोग http://msdn.microsoft.com/en-us/library/ms177541(v=sql.110).aspx
मैं जोड़ सकते हैं या करने के लिए सरल संग्रहीत प्रक्रिया लिखा अद्यतन बढ़ाया संपत्ति '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
मुझे इस दृष्टिकोण को पसंद है, हालांकि मैं एक उदाहरण में भाग गया जहां इस क्वेरी को निष्पादित करने के बाद मेरे पास खुले लेनदेन हैं। '' संदेश 266, स्तर 16, राज्य 2, प्रक्रिया up_DataDict, रेखा 178 EXECUTE के बाद लेनदेन की गणना BEGIN और COMMIT बयानों की एक मेल नहीं खाता इंगित करती है। पिछली गिनती = 0, वर्तमान गणना = 1. '' – Damian
मैंने नीचे एक समान दृष्टिकोण पोस्ट किया है, जो कोशिश/पकड़, लेनदेन रोलबैक (सुरुचिपूर्ण नहीं है, लेकिन डैमियन –
द्वारा उठाए गए चिंताओं से बचाता है। कार्यक्रम प्रवाह को नियंत्रित करने के लिए अपवाद हैंडलिंग (यानी आईएफ कथन के साथ क्या किया जा सकता है), एक [कोड गंध] (https://en.wikipedia.org/wiki/Code_smell) है! इसे देखें [stackoverflow सवाल] (https: //softwareengineering.stackexchange.com/questions/189222/are-exceptions-as-control-flow-Considered-a-serious-antipattern-if-so- क्यों) – DaveBoltman
यहाँ एक और संग्रहीत प्रक्रिया दृष्टिकोण, रुस्लान लालकृष्ण के लिए समान है, लेकिन इसमें कोशिश/पकड़ या स्पष्ट लेनदेन शामिल नहीं है:
-- 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. जांचें कि
- 2. जांचें कि
- 3. जांचें कि
- 4. जांचें कि PHP
- 5. वर्डप्रेस: जांचें कि लिंक
- 6. जांचें कि रूबी
- 7. जांचें कि JQuery
- 8. जांचें कि वेरिएबल
- 9. जांचें कि ssh
- 10. जांचें कि Jinja2
- 11. जांचें कि जावास्क्रिप्ट
- 12. जांचें कि क्या रूबी
- 13. जांचें कि सामान्य जेनेरिक
- 14. जांचें कि मैट्रिक्स Matlab
- 15. मछली खोल: जांचें कि
- 16. JQuery: जांचें कि '.remove()'
- 17. जांचें कि सरणी PHP
- 18. जांचें कि पहले पुश
- 19. जांचें कि यह फ़ाइल
- 20. जांचें कि फ़ाइल VBS
- 21. जांचें कि कैलेंडर
- 22. जांचें कि पाइथन
- 23. जांचें कि जावास्क्रिप्ट
- 24. जांचें कि क्या रजिस्ट्री
- 25. जांचें कि बैच वैरिएबल "..."
- 26. जांचें कि नया
- 27. जांचें कि फ़ाइल ksh
- 28. जांचें कि क्या स्ट्रिंग
- 29. जांचें कि क्या सी #
- 30. जांचें कि क्या लिनक्स
यह आपके प्रश्न के साथ विलय किया जाना चाहिए। –
जब आप "प्रश्न पूछें" तो आपके पास "अपने स्वयं के प्रश्न का उत्तर दें - अपना ज्ञान, प्रश्नोत्तर शैली साझा करें" का विकल्प है। यही वह है जो मैंने किया था क्योंकि समाधान की खोज करते समय मुझे अपने जैसा कोई प्रश्न नहीं मिला। – ScubaSteve
आह, मैंने देखा, लोगों ने पहले ऐसा नहीं देखा है। –