Как изменить параметр табличного значения - PullRequest
23 голосов
/ 14 ноября 2009

Я не получаю опцию «ALTER TO», когда нажимаю правую кнопку мыши на TVP

Ответы [ 2 ]

45 голосов
/ 14 ноября 2009

Не могу этого сделать. Вы должны сбросить / воссоздать. Если у вас есть зависимости от TVP, вы должны:

  1. создать новый TVP под новым именем
  2. изменить используемые зависимости (1)
  3. урони старый TVP
  4. воссоздать (1) под оригинальным именем
  5. изменить используемые зависимости (4)
  6. падение (1)
15 голосов
/ 06 сентября 2015

Я нашел сообщение в блоге на 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. Затем вы должны запустить его с именем типа таблицы в качестве входного параметра. Показать результаты в сеточном формате (поскольку текстовый формат может обрезать длинные тексты), выбрать всю таблицу результатов и скопировать ее в новое окно запроса.

...