加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

我会让其他人在这里讨好,但我相信如果你试图检查过程体的依赖性,你会遇到很多更新异常和级联问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读