2009-11-14 13 views
19

Ich bekomme keine Option wie 'ALTER TO', wenn rechts auf TVPWie ändert man die Tabelle Wert Parameter

+0

ALTER TO für TVP ?? Ein TVP ist Teil einer Funktions-/Prozedurdefinition. Keine Einheit für sich !? – Nestor

+0

ALTER TO-Option ist nicht aktiviert RT? – anishMarokey

+3

Tabellenwertige Parameter sind ein neuer Parametertyp in SQL Server 2008. Tabellenwerte werden mithilfe von benutzerdefinierten Tabellentypen deklariert. Ich vermute, dass Sie nach ALTERing benutzerdefinierten Tabellen-Typ fragen ?? Soweit ich weiß, können Sie einen benutzerdefinierten Tabellentyp CREATE und DROP erstellen, aber nicht ALTER es. – Nestor

Antwort

41

kann ich es nicht tun. Sie müssen ablegen/neu erstellen. Wenn Sie Abhängigkeiten von der TVP haben, müssen Sie:

  1. neue TVP unter neuem Namen
  2. alte Abhängigkeiten erstellen zu verwenden (1)
  3. Tropfen alt TVP
  4. recreate (1) unter ursprünglichen Namen
  5. alte Abhängigkeiten zu verwenden (4)
  6. Tropfen (1)
+3

Danke, aber die Mühe ist nervig. –

10

ich eingefunden habe, das eine Möglichkeit bietet, den Prozess zu automatisieren, indem die Abhängigkeiten vorübergehend gelöscht und dann neu erstellt werden.

Ich habe es nur ein bisschen geändert.

1.You sollte die folgende Prozedur erstellen:

-- 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 Sie es mit Ihrem Tabellentyp Namen als Eingabeparameter ausgeführt werden soll. Zeigen Sie die Ergebnisse im Rasterformat an (weil das Textformat lange Texte abschneiden könnte), wählen Sie die gesamte Ergebnistabelle aus und kopieren Sie sie in ein neues Abfragefenster.

+0

Haben Sie es getestet? – Shiva

+0

@Shiva - Ja, tat ich. Es hat für mich funktioniert. – BornToCode

+0

das war cool. Spart mir viel Zeit – Keith

Verwandte Themen