SQL用户定义的表类型:如果不用作参数,为什么我们可以删除它们?
发布时间:2020-12-12 07:02:02 所属栏目:MsSql教程 来源:网络整理
导读:我们都知道,如果SQL用户定义的表值类型(UDT)具有依赖性/依赖性,则不能删除它们.对. 但是,即使他们有家属,今天我也放了一个.只有标准是它们不应该用作DB对象的参数,如proc或func. CREATE TYPE FooUDT AS TABLE( ID int NOT NULL) 依赖的 CREATE PROCEDURE Bara
我们都知道,如果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 我会让其他人在这里讨好,但我相信如果你试图检查过程体的依赖性,你会遇到很多更新异常和级联问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |