2016-10-31 2 views
7

SQL 사용자 정의 테이블 값 테이블 유형 (UDT)은 종속 변수/종속성이있는 경우 삭제할 수 없습니다. 권리. SQL 사용자 정의 테이블 유형 : 매개 변수로 사용하지 않으면 왜 드롭 할 수 있습니까?

하지만, 오늘은 부양 가족이 있더라도 하나가 떨어졌다. 오직 criteria 만 proc 나 func 같은 DB 객체의 매개 변수로 사용해서는 안됩니다. 그것이 PROC 내에서 사용하고, 파라미터가 아니다대로
CREATE PROCEDURE Bar 
as 
BEGIN 
    DECLARE @Identifier FooUDT 

    --Some operations on @Identifier 
END 
GO 

FooUDT

종속

CREATE TYPE FooUDT AS TABLE 
(
    ID int NOT NULL 
) 

은 삭제 될 수있다. 하지만 다음과 같은 방법으로는 삭제할 수 없습니다. 더 흥미로운 무엇

CREATE PROCEDURE Bar 
    @Identifier FooUDT readonly 
as 
BEGIN 
    --Some operations on @Identifier 
END 
GO 

우리가 종속성을 확인하는 경우 두 경우 모두, 모두가 서로 이름을 표시하는 것입니다. 그러나 전자의 경우는 삭제할 수 있지만 후자는 삭제할 수 없습니다. 이유가 무엇입니까? 또는 나는 무엇인가 놓치고 있냐?

+3

[지연된 이름 확인 (https를로 알려진 T-SQL의 큰 misfeature 종속성 necesarily 최신 없으며, DROP은 더 이상 유효 코드를 작동합니다 : //technet.microsoft.com/ko-kr/library/ms190686). –

+1

@ JeroenMostert : UDT가 다르다. UDT가없고 구문이 올바른 경우에도 proc 파일은 생성되지 않습니다. –

+2

"지연된 컴파일"을 "지연된 이름 확인"으로 변경해서는 안된다는 것을 알고있었습니다. 그러나 아이디어는 동일합니다. 테이블이 아닌 모든 것에 대해 구문이 구문 분석되고 모든 객체가 존재하지 않으면 프로 시저가 작성되지 않습니다. 그러나 컴파일은 여전히 ​​지연되므로 T-SQL을 사용하지 않고도 오브젝트를 삭제할 수 있습니다. 지연된 컴파일은 저장 프로 시저의 메타 데이터에는 적용되지 않으며, 매개 변수로 사용되는 UDT를 삭제할 수없는 이유는 해당 명령문에만 적용됩니다. –

답변

4

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 

을 검토 할 수 있지만, 난 당신이 종속성 절차의 시체를 확인하려고 경우 업데이트 이상 및 캐스케이드 문제 적지으로 실행됩니다 생각합니다.

2

마이클 불러의 대답은

만 매개 변수에 대한 자리, 드롭 검증 발동 또는 UDF의 몸이 아닌 저장되어있다; 이 시체를 확인하는 것이 실용적이지 왜의 간단한 예는 또 다른 이유는 모든 스키마 변경에 모든 SP의/UDF를 재 컴파일 할 필요가있을 것이다 sp_execute_sql

https://msdn.microsoft.com/en-us/library/ms188001.aspx

를 통해 동적 SQL의 존재이다. 대신, 특히 생성되거나 변경 될 때만 요청에 따라 다시 컴파일됩니다. 그들은 컴파일 시간에 계산했기 때문에

당신은 종속성을 참조; 변경 사항이 발생했습니다 수도 있기 때문에하지만, ... 가능성

관련 문제