Я пытаюсь увеличить длину типа данных пользователя.Я придерживаюсь следующего подхода:
- переименовать тип данных в _old
- создать тип данных с тем же именем, но с увеличенной длиной.
- , выполнив 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