右键单击 TVP 时,我没有得到像“ALTER TO”这样的选项
问问题
24249 次
4 回答
46
做不到。您必须删除/重新创建。如果您对 TVP 有依赖关系,则必须:
- 以新名称创建新 TVP
- 更改要使用的依赖项 (1)
- 放弃旧的TVP
- 以原始名称重新创建 (1)
- 更改要使用的依赖项 (4)
- 下降 (1)
于 2009-11-14T19:23:05.993 回答
16
我在 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.然后你应该用你的表类型名称作为输入参数运行它。以网格格式显示结果(因为文本格式可能会截断长文本),选择整个结果表并将其复制到新的查询窗口。
于 2015-09-06T10:21:20.510 回答
3
问题
只要它被其他任何东西引用,您就不能删除用户定义的表类型:
无法删除类型“ dbo.MyTableType ”,因为它被对象“ MyStoredProcedure ”引用。可能有其他对象引用此类型。
如果 SSMS 为您提供所有其他对象的列表,那就太好了,但如果您没有很多,部分手动的方法可能会很好。
查找用法
要获取使用您的 TVP 类型的所有 SP 的列表,您可以查询sys.sql_expression_dependencies
SELECT OBJECT_NAME(d.referencing_id)
FROM sys.sql_expression_dependencies d
WHERE d.referenced_id = TYPE_ID('MyTableType')
脚步
- 选择上面确定的所有 SP 并选择
DROP and CREATE to
新窗口 - 浏览每个窗口,然后突出显示/执行该
DROP PROCEDURE
部分 - 现在您可以选择您的类型并选择
DROP and CREATE to
新窗口并进行任何更改 - 返回您打开的 SP 窗口列表并执行该
CREATE
部分
延伸阅读
于 2019-08-14T22:42:52.567 回答
0
- 删除所有使用您要更改的 TVP 的 SP。(不要忘记获取 SP 和 TVP 的备份)
- 现在删除您必须更改的 TVP。
- 修改您在第 2 步中删除的同一 TVP,然后再次创建它。(此处更改了 TVP)。
- 现在再次创建您在第一步中删除的所有 SP。(您的 SP 已准备好与更改的 TVP 一起使用)。
您将取回 TVP 和所有使用相同 TVP 的 Sp。
于 2020-07-07T15:30:11.927 回答