Ошибка во время sp_refreshsqlmodule после изменения типа таблицы - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь добавить столбец в определяемый пользователем тип таблицы. Я провел некоторое исследование, и вот что у меня сейчас:

  -- First, rename existing table type to something else
EXEC sp_rename 'TT_MY_TABLE_TYPE', 'TT_MY_TABLE_TYPE_1'

-- Create the new table type
CREATE TYPE [dbo].[TT_MY_TABLE_TYPE] AS TABLE(
    [MY_FIELD] [varchar](20) NULL        
)
GO

-- Do a refresh of the SP/views so that the SP/views will refer to the new table type
-- Save the list of dependencies to a temporary table
SELECT  'sp_refreshsqlmodule ' + quotename('MySchemaName.' +object_name(referencing_id), '''') AS SQL_CMD
INTO    #TEMPSQL
FROM    sys.sql_expression_dependencies
WHERE   referenced_class_desc = 'TYPE' and referenced_entity_name =  'TT_MY_TABLE_TYPE';

DECLARE @sql NVARCHAR(1000)
-- Do a loop for the list of dependencies, use dynamic SQL to execute the SQL commands
DECLARE c_Cur CURSOR FOR
    SELECT  SQL_CMD
    FROM    #TEMPSQL

OPEN c_Cur
FETCH NEXT FROM c_Cur INTO @sql
WHILE (@@FETCH_STATUS = 0)
BEGIN
    EXEC SP_EXECUTESQL @statement = @sql
    FETCH NEXT FROM c_Cur INTO @sql
END

CLOSE c_Cur
DEALLOCATE c_Cur

-- Drop the old table type
DROP TYPE TT_MY_TABLE_TYPE_1

DROP TABLE #TEMPSQL

К сожалению, при обновлении хранимых / процедур (их зависимостей) для отражения нового типа я получаю следующую ошибку:

Процедура sp_refreshsqlmodule_internal, строка 85 [Строка пакетного запуска 0]

Тип операнда cla sh: TT_MY_TABLE_TYPE несовместим с TT_MY_TABLE_TYPE_1.

Я предполагаю, что ошибка что-то иначе, поскольку все, что я делал, это добавлял один столбец к новому типу.

Когда я пытаюсь изменить функцию, имеющую этот тип в качестве зависимости, у меня появляется тот же тип операнда cla sh error

Не могли бы вы помочь мне определить, в чем причина root этой проблемы?

1 Ответ

1 голос
/ 23 января 2020

Всем, кто может столкнуться с этой проблемой: проблема заключалась во вложенных зависимостях. Вам нужно запустить sp_refreshsqlmodule , начиная с нижней части иерархии зависимостей. Если вы попытаетесь обновить sh хранимую процедуру, которая использует этот тип таблицы и передает его дальше, вы получите этот тип операнда cla sh error

...