2017-01-31 151 views
0

テーブルとカラムに拡張プロパティを追加しようとしましたが、SQL Serverがストアドプロシージャの追加と更新を分離しているため、これらの2つのストアドプロシージャのために、テーブルとカラムレベルでの追加または更新に必要な3つのパラメータだけで記述を作成できます。この私の現在のコード:別のストアドプロシージャからsp_addextendedpropertyを呼び出すときのエラー

CREATE PROCEDURE sp_addorupdatedesc 
    @tableName varchar, 
    @columnName varchar = NULL, 
    @objectDescription varchar 
AS 
BEGIN 
    IF (@columnName IS NULL) 
    BEGIN 
     IF NOT EXISTS (SELECT 1 FROM fn_listextendedproperty (NULL, 'user', 'dbo', 'table', default, NULL, NULL) WHERE [email protected]) 
     BEGIN 
      EXECUTE sp_addextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, default, NULL 
     END 
     ELSE 
     BEGIN 
      EXECUTE sp_updateextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, default, NULL 
     END 
    END 
    ELSE 
    BEGIN 
     IF NOT EXISTS (SELECT 1 
         FROM sys.extended_properties AS ep 
         INNER JOIN sys.tables AS t ON ep.major_id = t.object_id 
         INNER JOIN sys.columns AS c ON ep.major_id = c.object_id AND ep.minor_id = c.column_id 
         WHERE class = 1 AND [email protected] AND C.name = @columnName) 
     BEGIN 
      EXECUTE sp_addextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, 'column', @columnName 
     END 
     ELSE 
     BEGIN 
      EXECUTE sp_updateextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, 'column', @columnName 
     END 
    END 
END 
GO 

しかし、私は、このストアドプロシージャを使用する場合、私が代わりにこのエラーが発生します。

メッセージ15135、レベル16、状態8、プロシージャsp_addextendedpropertyを、ライン58
オブジェクトがあります無効。拡張プロパティは 'dbo.P.P'には許可されていないか、オブジェクトが存在しません。

+0

サイドノート:ストアドプロシージャのプレフィックス 'sp_'を使用しないでください**。マイクロソフトは、[*ストアドプロシージャの名前付け*を参照してください](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx)、およびあなたはいつか名前衝突のリスクを将来実行します。 [ストアドプロシージャのパフォーマンスにも悪い](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)単に 'sp_'を避け、他の何かを接頭辞として使うのが最善です - 接頭辞はまったくありません! –

+0

あなたの摂取に感謝します – Angga

+1

[悪い習慣:(長さ)なしでVARCHARを宣言](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring- varchar-without-length.aspx) - 使用する 'varchar'変数とパラメータの長さを常に**指定してください。 **パラメータ**を 'varchar'として定義した場合、長さは指定されません。**デフォルトでは**完全に1文字*長さになります**通常は**あなたが望むものではありません!だから**常に**長さを使用する!だからあなたの表と列の名前と説明はすべて**シングル文字に切り捨てられます** ** –

答えて

0

私はmarc_Sが提案したように私のストアドプロシージャを変更しました。

これはちょっと間違いかもしれませんが、「TableName」、「ColumnName」、「Description」の3つのパラメータを持つストアドプロシージャのテーブルまたは列に拡張プロパティを追加または更新する必要がある場合は、

ここにコードがあります。

CREATE PROCEDURE setdescription 
    @tableName varchar(100), 
    @columnName varchar(100) = NULL, 
    @objectDescription varchar(250) 
AS 
BEGIN 
    IF (@columnName IS NULL) 
     BEGIN 
      IF NOT EXISTS (SELECT 1 FROM fn_listextendedproperty (NULL, 'user', 'dbo', 'table', default, NULL, NULL) WHERE [email protected]) 
       BEGIN 
        EXECUTE sp_addextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, default, NULL 
       END 
      ELSE 
       BEGIN 
        EXECUTE sp_updateextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, default, NULL 
       END 
     END 
    ELSE 
     BEGIN 
      IF NOT EXISTS (SELECT 1 FROM sys.extended_properties AS ep 
           INNER JOIN sys.tables AS t ON ep.major_id = t.object_id 
           INNER JOIN sys.columns AS c ON ep.major_id = c.object_id AND ep.minor_id = c.column_id 
           WHERE class = 1 AND [email protected] AND C.name = @columnName) 
       BEGIN 
        EXECUTE sp_addextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, 'column', @columnName 
        --EXECUTE sp_addextendedproperty @name=N'CXC_DESCRIPTION', @[email protected], @level0type=N'user', @level0name=N'dbo', @level1type=N'table', @[email protected], @level2type=N'column', @[email protected] 
       END 
      ELSE 
       BEGIN 
        EXECUTE sp_updateextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, 'column', @columnName 
       END 
     END 
END 
GO 
関連する問題