我们都知道,如果sql用户定义的表值类型(UDT)具有依赖性/依赖性,则不能删除它们.对.
但是,即使他们有家属,今天我也放了一个.只有标准是它们不应该用作DB对象的参数,如proc或func.
CREATE TYPE FooUDT AS TABLE ( ID int NOT NULL )
依赖的
CREATE PROCEDURE Bar as BEGIN DECLARE @Identifier FooUDT --Some operations on @Identifier END GO
FooUDT可以在proc中使用时删除,而不是参数.但是跟随方式它不能被丢弃.
CREATE PROCEDURE Bar @Identifier FooUDT readonly as BEGIN --Some operations on @Identifier END GO
更有趣的是,在这两种情况下,如果我们检查依赖关系,两者都会显示彼此的名称.然而,前一种情况可以被取消,但后者则不然.为什么这个?或者我错过了什么?
解决方法
sql Server将存储过程体存储为DECLARE @Identifier FooUDT在过程体中的文本.
Select text,* from sysobjects A JOIN syscomments B On A.id = B.id where xtype = 'P'
但是,参数存储在元数据中.您可以按如下方式查看它们……
SELECT SCHEMA_NAME(SCHEMA_ID) AS[Schema],SO.name AS[ObjectName],SO.Type_Desc AS[ObjectType(UDF / SP)],P.parameter_id AS[ParameterID],P.name AS[ParameterName],TYPE_NAME(P.user_type_id) AS[ParameterDataType],P.max_length AS[ParameterMaxBytes],P.is_output AS[IsOutPutParameter] FROM sys.objects AS SO INNER JOIN sys.parameters AS P ON SO.OBJECT_ID = P.OBJECT_ID WHERE SO.OBJECT_ID IN(SELECT OBJECT_ID FROM sys.objects WHERE TYPE IN('P','FN')) ORDER BY[Schema],SO.name,P.parameter_id
我会让其他人在这里讨好,但我相信如果你试图检查过程体的依赖性,你会遇到很多更新异常和级联问题.