ALTER TYPE 不可用 那么如何更改类型?

eko*_*lis 4 sql-server user-defined-table-type

我知道关于这个问题还有其他问题,但这个问题真的很简单,所以我不是在寻找一个复杂的答案!

所以我有这个脚本:

IF  EXISTS (SELECT * FROM sys.types st JOIN sys.schemas ss ON st.schema_id = ss.schema_id WHERE st.name = N'IDListTableType' AND ss.name = N'dbo')
DROP TYPE [dbo].[IDListTableType]
GO

IF NOT EXISTS (SELECT * FROM sys.types st JOIN sys.schemas ss ON st.schema_id = ss.schema_id WHERE st.name = N'IDListTableType' AND ss.name = N'dbo')
CREATE TYPE [dbo].[IDListTableType] AS TABLE(
    [ID] [int] NOT NULL,
    UNIQUE NONCLUSTERED 
(
    [ID] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
GO
Run Code Online (Sandbox Code Playgroud)

运行它时出现错误,因为它IDListTableType在数据库中的其他地方被引用。因此,我需要一种方法来更改表类型,或者查找并删除并重新创建所有其他引用IDListTableType. 有没有一种简单的方法可以做到这一点?

Aar*_*and 5

最简单的方法是使用更新的定义创建一个类型,然后您可以一次(或一次)更改受影响的对象以引用新名称。你不能拉桌布。

我在这里写了一篇关于这个的文章:

基本过程是:

  1. 创建一个新类型
  2. 确定哪些对象引用旧类型
  3. 手动更改这些对象以指向新类型(或至少那些需要使用新类型的对象)
  4. 可选地,删除旧类型

棘手的部分是 #2,人们会手动狩猎和啄食,或者尝试解析OBJECT_DEFINITIONsys.sql_modules,但以下更可靠:

SELECT s.name, o.name, def = OBJECT_DEFINITION(d.referencing_id) 
  FROM sys.sql_expression_dependencies AS d
  INNER JOIN sys.objects AS o
     ON d.referencing_id = o.[object_id]
  INNER JOIN sys.schemas AS s
     ON o.[schema_id] = s.[schema_id]
  WHERE d.referenced_database_name IS NULL
    AND d.referenced_schema_name = N'dbo'
    AND d.referenced_entity_name = N'MyType';           
Run Code Online (Sandbox Code Playgroud)