如何更改表值参数

VIn*_*ayK 23 t-sql sql-server table-valued-parameters

当我点击TVP时,我没有得到像'ALTER TO'这样的选项

Pet*_*hia 45

不能这样做.您必须删除/重新创建.如果您对TVP有依赖关系,您必须:

  1. 以新名称创建新的TVP
  2. 改变依赖关系使用(1)
  3. 放弃旧的TVP
  4. 以原始名称重新创建(1)
  5. 改变依赖关系使用(4)
  6. 掉落(1)

  • 谢谢你,但麻烦很糟糕. (6认同)

Bor*_*ode 15

在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
Run Code Online (Sandbox Code Playgroud)

2.然后,您应该使用您的表类型名称作为输入参数来运行它.以网格格式显示结果(因为文本格式可能会截断长文本),选择整个结果表并将其复制到新的查询窗口.