SQL用户定义的表类型:如果不用作参数,为什么我们可以删除它们?
发布时间:2020-05-24 09:27:31 所属栏目: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
我会让其他人在这里讨好,但我相信如果你试图检查过程体的依赖性,你会遇到很多更新异常和级联问题. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
