2009-11-14 17 views
19

No obtengo la opción como 'ALTER TO' cuando hago clic derecho en TVPCómo ALTERAR el parámetro de valor de tabla

+0

ALTER TO para TVP ?? un TVP es parte de una definición de función/procedimiento. ¿No es una entidad en sí misma? – Nestor

+0

La opción ALTER TO no está habilitada RT? – anishMarokey

+3

Los parámetros con valores de tabla son un nuevo tipo de parámetro en SQL Server 2008. Los parámetros con valores de tabla se declaran utilizando tipos de tabla definidos por el usuario. ¿Supongo que estás preguntando por ALTERAR el tipo de tabla definida por el usuario? Por lo que yo sé, puedes CREAR y ABANDONAR un tipo de tabla definido por el usuario, pero no ALTERARlo. – Nestor

Respuesta

41

No puedo hacerlo. Debe soltar/recrear. Si tiene dependencias en la TVP, es necesario:

  1. crear nuevas TVP bajo el nuevo nombre de
  2. dependencias alter utilizar (1)
  3. caída de edad TVP
  4. recrear (1) bajo el nombre original
  5. dependencias alter utilizar (4)
  6. gota (1)
+3

Gracias, pero la molestia es una mierda. –

10

he encontrado un blog post on sqltreeo.com que tiene una manera de automatizar el proceso mediante la eliminación temporal de las dependencias y luego volver a crearlas.

Acabo de modificarlo un poco.

1.You debe crear el siguiente procedimiento:

-- 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. A continuación, se debe ejecutar con su nombre de tipo de tabla como parámetro de entrada. Muestre los resultados en formato de cuadrícula (porque el formato de texto puede truncar textos largos), seleccione la tabla de resultados completa y cópiela en una nueva ventana de consulta.

+0

¿Lo has probado? – Shiva

+0

@Shiva - Sí, lo hice. Funcionó para mí – BornToCode

+0

esto fue genial. Me ahorra mucho tiempo – Keith

Cuestiones relacionadas