拡張プロパティを追加するスクリプトがあります。一部は表を記述し、一部は列を記述します。スクリプトがエラーをスローしないように、追加する前に拡張プロパティが存在するかどうかを確認するにはどうすればよいですか?追加する前に拡張プロパティの説明が既に存在するかどうか確認してください。
答えて
テーブルを記述する拡張プロパティが存在する場合、この最初のスクリプトをチェック:
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')
テーブルに複数の拡張プロパティがある場合は、列IDを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
私はこのアプローチが好きですが、私はこのクエリを実行した後にOpen Transactionを実行しているインスタンスを実行しました。 '' ' メッセージ266、レベル16、状態2、プロシージャup_DataDict、行178 EXECUTEの後のトランザクション数は、一致しない数のBEGINおよびCOMMIT文を示します。 '' ' – Damian
私はtry/catch、トランザクションのロールバック(エレガントではありませんが、Damianによって提起された懸念を避ける)を使用しないで同様のアプローチを投稿しました –
便利です。プログラムの流れを制御するための例外処理(IF文で何ができるか)は、[code smell](https://en.wikipedia.org/wiki/Code_smell)です。この[stackoverflow question](https: //softwareengineering.stackexchange.com/questions/189222/are-exceptions-as-control-flow-considered-a-serious-antipattern-if-so-why)。 – DaveBoltman
はルスランK.さんに似た別のストアドプロシージャのアプローチであり、試行/キャッチまたは明示的な取引は含まれません。
-- 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
これはあなたの質問にマージする必要があります。 –
「質問する」を選択すると、「あなた自身の質問に答えてください - あなたの知識、Q&Aスタイルを共有してください」というオプションがあります。これは解決策を研究しているときに似たような質問を見つけることができなかったので、私がしたことです。 – ScubaSteve
ああ、私は、人々がこれを前にやっているのを見たことがない。 –