How to ALTER the Table Value Parameter

前端 未结 4 1383
南方客
南方客 2020-12-08 10:59

I am not getting option like \'ALTER TO\' when am right clicking on TVP

相关标签:
4条回答
  • 2020-12-08 11:08

    Can't do it. You must drop/recreate. If you have dependencies on the TVP, you must:

    1. create new TVP under new name
    2. alter dependencies to use (1)
    3. drop old TVP
    4. recreate (1) under original name
    5. alter dependencies to use (4)
    6. drop (1)
    0 讨论(0)
  • 2020-12-08 11:13

    I've found a blog post on sqltreeo.com which has a way to automate the process by temporary dropping the dependencies and then re-creating them.

    I just modified it a bit.

    1.You should create the following procedure:

    -- 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.Then you should run it with your table type name as a input parameter. Show the results on grid format (because text format might truncate long texts), select entire result table and copy it to a new query window.

    0 讨论(0)
  • 2020-12-08 11:16
    1. Drop all the SP's which uses the TVP you want to alter.(Don't Forget to get the backup the of SP's & TVP)
    2. Now Drop the TVP Which you have to alter.
    3. Than Modify the same TVP which you have dropped in step 2 & than Create it Again.(TVP is altered here).
    4. Now Create again all the SP's Which you have dropped in 1st Step. (Your SP's are ready to use with altered TVP).

    You will get back the TVP and All the Sp's which uses the same TVP.

    0 讨论(0)
  • 2020-12-08 11:20

    Problem

    You cannot drop the User Defined Table Type as long as it's referenced by anything else:

    Cannot drop type 'dbo.MyTableType' because it is being referenced by object 'MyStoredProcedure'. There may be other objects that reference this type.

    It would be nice if SSMS gave you a listing of all other objects, but if you don't have many, a partially manual approach might work fine.

    Find Usages

    To get a list of all SPs that use your TVP type, you can query sys.sql_expression_dependencies

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

    Steps

    1. Select all SPs identified above and select DROP and CREATE to new window
    2. Go through each window, and just highlight / execute the DROP PROCEDURE section
    3. Now you can select your type and select DROP and CREATE to new window and make any changes
    4. Go back to the list of SP's windows you opened and execute the CREATE section

    Further Reading

    • Altering user-defined table types in SQL Server
    • How to do ALTER TABLE TYPE efficiently
    • List user defined types in a SQL Server database
    0 讨论(0)
提交回复
热议问题