SQL用户定义的表类型:如果不用作参数,为什么我们可以删除它们?

前端之家收集整理的这篇文章主要介绍了SQL用户定义的表类型:如果不用作参数,为什么我们可以删除它们?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们都知道,如果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

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

原文链接:https://www.f2er.com/mssql/77208.html

猜你在找的MsSQL相关文章