2009-11-14 2 views
19

TVP에서 마우스 오른쪽 버튼을 클릭 할 때 '변경'과 같은 옵션이 표시되지 않습니다.테이블 값 매개 변수를 변경하는 방법

+0

TV 용 ALTER TO ?? TVP는 함수/프로 시저 정의의 일부입니다. 엔티티 자체가 아니야!? – Nestor

+0

ALTER TO 옵션이 활성화되어 있지 않습니다. RT? – anishMarokey

+3

테이블 반환 매개 변수는 SQL Server 2008의 새로운 매개 변수 유형입니다. 테이블 반환 매개 변수는 사용자 정의 테이블 형식을 사용하여 선언됩니다. 사용자 정의 테이블 형식을 변경하는 것에 대해 묻는 것 같습니까? 내가 아는 한, 사용자 정의 테이블 유형을 CREATE 및 DROP 할 수 있지만 ALTER하지는 않습니다. – Nestor

답변

41

Can not do. 당신은 드롭/재현해야합니다. 당신이 TVP에 의존성이있는 경우, 다음을 수행해야합니다

  1. 가 TVP
  2. 구 (1)
  3. 드롭
  4. 재 작성 (1) 원래 이름
  5. 아래를 사용하여 새 이름으로
  6. ALTER 종속성을 새로운 TVP를 만들
  7. ALTER 의존성 내가를 발견했습니다 (4)
  8. 드롭 (1)
+3

고맙습니다. 그러나 번거 로움은 끔찍합니다. –

10

사용에는 종속성을 일시적으로 삭제 한 다음 다시 작성하여 프로세스를 자동화하는 방법이 있습니다.

방금 ​​수정했습니다.

1.You는 다음 절차를 만들어야합니다

-- Find all referencing objects to user-defined table type in @fullObjectName parameter 
-- and generate DROP scripts and CREATE scripts for them 
CREATE PROC [dbo].[alterTableType] (@fullObjectName VARCHAR(200)) 
AS 
BEGIN 
    SET NOCOUNT ON 

    IF (TYPE_ID (@fullObjectName) IS NULL) 
    BEGIN 
     RAISERROR ('User-defined table type ''%s'' does not exists. Include full object name with schema.', 16,1, @fullObjectName) 
     RETURN 
    END; 

    WITH sources 
    AS 
    (
     SELECT ROW_NUMBER() OVER (ORDER BY OBJECT_NAME(m.object_id)) RowId, definition 
     FROM sys.sql_expression_dependencies d 
     JOIN sys.sql_modules m ON m.object_id = d.referencing_id 
     JOIN sys.objects o ON o.object_id = m.object_id 
     WHERE referenced_id = TYPE_ID(@fullObjectName) 
    ) 
    SELECT 'BEGIN TRANSACTION' 
    UNION ALL 
    SELECT 

     'DROP ' + 
      CASE OBJECTPROPERTY(referencing_id, 'IsProcedure') 
      WHEN 1 THEN 'PROC ' 
      ELSE 
       CASE 
        WHEN OBJECTPROPERTY(referencing_id, 'IsScalarFunction') = 1 OR OBJECTPROPERTY(referencing_id, 'IsTableFunction') = 1 OR OBJECTPROPERTY(referencing_id, 'IsInlineFunction') = 1 THEN 'FUNCTION ' 
        ELSE '' 
       END 
      END 
     + SCHEMA_NAME(o.schema_id) + '.' + 
     + OBJECT_NAME(m.object_id)  

    FROM sys.sql_expression_dependencies d 
    JOIN sys.sql_modules m ON m.object_id = d.referencing_id 
    JOIN sys.objects o ON o.object_id = m.object_id 
    WHERE referenced_id = TYPE_ID(@fullObjectName) 
    UNION ALL 
    SELECT 'GO' 
    UNION ALL 
    SELECT CHAR(13) + CHAR(10) + '---- WRITE HERE SCRIPT TO DROP OLD USER DEFINED TABLE TYPE AND CREATE A NEW ONE ----' + CHAR(13) + CHAR(10) 
    UNION ALL 
    SELECT 
     CASE 
      WHEN number = RowId THEN DEFINITION 
      ELSE 'GO' 
     END 
    FROM sources s 
    JOIN (SELECT DISTINCT number FROM master.dbo.spt_values) n ON n.number BETWEEN RowId AND RowId+1 
    UNION ALL 
    SELECT 'COMMIT' 
END 

2.Then 당신이 입력 매개 변수로 테이블 형식의 이름으로 실행해야합니다. 표 형식으로 결과를 표시하십시오 (텍스트 형식은 긴 텍스트를 절단 할 수 있으 G로 전체 결과표를 선택하여 새 조회 창에 복사하십시오).

+0

테스트 해 보셨습니까? – Shiva

+0

@ Shiva - 예, 했어요. 그것은 나를 위해 일했습니다. – BornToCode

+0

이것은 시원했다. 많은 시간을 절약합니다. – Keith

관련 문제