Обновить тип таблицы при изменении базового UDT - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь увеличить длину типа данных пользователя.Я придерживаюсь следующего подхода:

  1. переименовать тип данных в _old
  2. создать тип данных с тем же именем, но с увеличенной длиной.
  3. , выполнив sp_refreshsqlmodule для SP иFN, которые ссылаются на это.

Я не мог придумать, как обрабатывать пользовательские типы таблиц, потому что их мета не может быть обновлена ​​с помощью sp_refreshsqlmodule.Их так много, и я не могу написать и создать для каждого из типов таблиц вручную.

Просмотренные сообщения могут быть опубликованы, но безуспешно, поэтому, если у вас есть какие-либо идеи, пожалуйста, оставьте свои ответы.Похожий вопрос был задан, но ответа нет.

Я публикую фрагмент кода для справки.Спасибо.

/****** DROP OBJECTS ******/
IF(OBJECT_ID('dbo.Test_SP',N'P') IS NOT NULL)
  DROP PROCEDURE dbo.Test_SP
GO

IF EXISTS(SELECT 1 FROM sys.table_types WHERE name = 'TestTableType' AND schema_id = SCHEMA_ID('dbo'))
  DROP TYPE dbo.TestTableType
GO

IF EXISTS(SELECT 1 FROM sys.types WHERE name = 'TestType_Old' AND schema_id = SCHEMA_ID('dbo'))
  DROP TYPE dbo.TestType_Old
GO

IF EXISTS(SELECT 1 FROM sys.types WHERE name = 'TestType' AND schema_id = SCHEMA_ID('dbo'))
  DROP TYPE dbo.TestType
GO
/**************************/

CREATE TYPE dbo.TestType FROM VARCHAR(30) NULL
GO

CREATE TYPE dbo.TestTableType AS TABLE (FullName dbo.TestType )
GO

CREATE PROCEDURE dbo.Test_SP (@FullName dbo.TestType)
AS
(
  SELECT  @FullName
)
GO

DECLARE @FN dbo.TestType

SET @FN = REPLICATE('A',30)

EXEC dbo.Test_SP  @FullName = @FN
GO


EXEC sp_rename N'dbo.TestType'
              ,N'TestType_Old'
              ,N'USERDATATYPE'
GO

CREATE TYPE dbo.TestType FROM VARCHAR(60) NULL
GO

DECLARE cur CURSOR FOR
SELECT  sch.name + N'.' + obj.name
FROM    sys.sql_expression_dependencies sed
        INNER JOIN sys.objects obj
          ON sed.referencing_id = obj.object_id
        INNER JOIN sys.schemas sch WITH(NOLOCK)
          ON sch.schema_id = obj.schema_id
WHERE   referenced_class_desc = 'TYPE' 
        AND referenced_entity_name IN(N'TestType',N'TestType_Old')
        AND referenced_schema_name = N'dbo'
UNION
SELECT  sch.name + N'.' + obj.name [ObjectName]
FROM    sys.columns col WITH(NOLOCK)
        INNER JOIN sys.objects obj WITH(NOLOCK)
          ON col.object_id = obj.object_id
        INNER JOIN sys.types typ WITH(NOLOCK)
          ON col.user_type_id = typ.user_type_id
        INNER JOIN sys.schemas sch WITH(NOLOCK)
          ON obj.schema_id = sch.schema_id
WHERE   typ.name IN(N'TestType',N'TestType_Old')
        AND typ.schema_id = SCHEMA_ID(N'dbo')
        AND is_ms_shipped = 0
        AND obj.type IN(N'TF','FS', 'IF');

OPEN cur;

DECLARE @ObjectName NVARCHAR(MAX);

FETCH NEXT FROM cur INTO @ObjectName;
WHILE(@@FETCH_STATUS = 0)
BEGIN
  PRINT @ObjectName;
  EXEC sp_refreshsqlmodule @name = @ObjectName;
  FETCH NEXT FROM cur INTO @ObjectName;
END;

CLOSE cur;
DEALLOCATE cur;
GO

DECLARE @FN dbo.TestType

SET @FN = REPLICATE('B',60)

EXEC dbo.Test_SP  @FullName = @FN
GO

--IF EXISTS(SELECT 1 FROM sys.table_types WHERE name = 'TestTableType' AND schema_id = SCHEMA_ID('dbo'))
--  DROP TYPE dbo.TestTableType
--GO

--CREATE TYPE dbo.TestTableType AS TABLE (FullName dbo.TestType )
--GO

--EXEC sp_refreshsqlmodule @name = 'TestTableType'; --TT_TestTableType_1BA066B0

--doesnt work until I drop and recreate that table type
DROP TYPE dbo.TestType_Old
GO
...