25

TVPを右クリックしても、「ALTERTO」のようなオプションが表示されません

4

4 に答える 4

46

できません。ドロップ/再作成する必要があります。TVP に依存している場合は、次のことを行う必要があります。

  1. 新しい名前で新しい TVP を作成する
  2. 使用する依存関係を変更する (1)
  3. 古いTVPをドロップ
  4. (1)を元の名前で作り直す
  5. 使用する依存関係を変更する (4)
  6. ドロップ (1)
于 2009-11-14T19:23:05.993 に答える
16

依存関係を一時的に削除してから再作成することにより、プロセスを自動化する方法があるsqltreeo.com のブログ投稿を見つけました。

少しだけ修正しました。

1.次のプロシージャを作成する必要があります。

-- Find all referencing objects to user-defined table type in @fullObjectName parameter
-- and generate DROP scripts and CREATE scripts for them
CREATE PROC [dbo].[alterTableType] (@fullObjectName VARCHAR(200))
AS
BEGIN
    SET NOCOUNT ON

    IF (TYPE_ID (@fullObjectName) IS NULL)
    BEGIN
        RAISERROR ('User-defined table type ''%s'' does not exists. Include full object name with schema.', 16,1, @fullObjectName)
        RETURN
    END;

    WITH sources
    AS
    (
        SELECT ROW_NUMBER() OVER (ORDER BY OBJECT_NAME(m.object_id)) RowId, definition
        FROM sys.sql_expression_dependencies d
        JOIN sys.sql_modules m ON m.object_id = d.referencing_id
        JOIN sys.objects o ON o.object_id = m.object_id
        WHERE referenced_id = TYPE_ID(@fullObjectName)
    )
    SELECT 'BEGIN TRANSACTION'
    UNION ALL   
    SELECT 

        'DROP ' +
            CASE OBJECTPROPERTY(referencing_id, 'IsProcedure')
            WHEN 1 THEN 'PROC '
            ELSE
                CASE
                    WHEN OBJECTPROPERTY(referencing_id, 'IsScalarFunction') = 1 OR OBJECTPROPERTY(referencing_id, 'IsTableFunction') = 1 OR OBJECTPROPERTY(referencing_id, 'IsInlineFunction') = 1 THEN 'FUNCTION '
                    ELSE ''
                END
            END
        + SCHEMA_NAME(o.schema_id) + '.' +
        + OBJECT_NAME(m.object_id)    

    FROM sys.sql_expression_dependencies d
    JOIN sys.sql_modules m ON m.object_id = d.referencing_id
    JOIN sys.objects o ON o.object_id = m.object_id
    WHERE referenced_id = TYPE_ID(@fullObjectName)
    UNION  ALL
    SELECT  'GO'
    UNION ALL
    SELECT CHAR(13) + CHAR(10) + '---- WRITE HERE SCRIPT TO DROP OLD USER DEFINED TABLE TYPE AND CREATE A NEW ONE ----' + CHAR(13) + CHAR(10)
    UNION  ALL
    SELECT
        CASE
            WHEN number = RowId    THEN DEFINITION
            ELSE 'GO'
        END
     FROM sources s
    JOIN (SELECT DISTINCT number FROM master.dbo.spt_values) n ON n.number BETWEEN RowId AND RowId+1
    UNION ALL
    SELECT 'COMMIT'
END

2.次に、入力パラメーターとしてテーブルタイプ名を使用して実行する必要があります。結果をグリッド形式で表示し (テキスト形式では長いテキストが切り捨てられる可能性があるため)、結果テーブル全体を選択して新しいクエリ ウィンドウにコピーします。

于 2015-09-06T10:21:20.510 に答える
3

問題

他の何かによって参照されている限り、ユーザー定義のテーブル タイプを削除することはできません。

オブジェクト ' MyStoredProcedure ' によって参照されているため、型 ' dbo.MyTableType ' を削除できません。このタイプを参照する他のオブジェクトが存在する場合があります。

SSMS が他のすべてのオブジェクトのリストを提供してくれるとよいのですが、そうでない場合は、部分的に手動の方法でうまくいく可能性があります。

使用箇所を探す

TVP タイプを使用するすべての SP のリストを取得するには、クエリを実行できます。sys.sql_expression_dependencies

SELECT OBJECT_NAME(d.referencing_id)
FROM sys.sql_expression_dependencies d
WHERE d.referenced_id = TYPE_ID('MyTableType')

手順

  1. 上記で識別されたすべての SP を選択し、DROP and CREATE to新しいウィンドウを選択します
  2. 各ウィンドウに移動し、DROP PROCEDUREセクションを強調表示/実行するだけです
  3. これで、タイプを選択してDROP and CREATE to新しいウィンドウを選択し、変更を加えることができます
  4. 開いたSPのウィンドウのリストに戻り、CREATEセクションを実行します

参考文献

于 2019-08-14T22:42:52.567 に答える
0
  1. 変更したい TVP を使用するすべての SP をドロップします (SP と TVP のバックアップを取得することを忘れないでください)。
  2. ここで、変更する必要がある TVP をドロップします。
  3. 手順 2 で削除した同じ TVP を変更し、再度作成します (TVP はここで変更されます)。
  4. ここで、最初のステップでドロップしたすべての SP を再度作成します。(あなたの SP は変更された TVP ですぐに使用できます)。

TVP と、同じ TVP を使用するすべての SP が返されます。

于 2020-07-07T15:30:11.927 に答える