2009-11-14 18 views
19

TVPTablo Değeri Parametresinin Değiştirilmesi Nasıl Yapılır

+0

TVP için ALTER TO? TVP, bir işlev/prosedür tanımının parçasıdır. Bir varlık kendi başına değil !? – Nestor

+0

ALTER TO seçeneği aktif değil RT? – anishMarokey

+3

Tablo değerli parametreler, SQL Server 2008'de yeni bir parametre türüdür. Tablo değerli parametreler, kullanıcı tanımlı tablo türleri kullanılarak bildirilmiştir. ALTERing kullanıcı tanımlı tablo türü hakkında soru soruyorsunuz? Bildiğim kadarıyla, kullanıcı tanımlı bir tablo türünü CREATE ve DROP yapabilirsin, fakat bunu ALTER olarak değil. – Nestor

cevap

41

Üzerine sağ tıklandığında "ALTER TO" gibi bir seçenek alamıyorum. Bunu yapamıyorum. Bırakmanız/yeniden oluşturmanız gerekir. Eğer TVP üzerinde bağımlılıkları varsa, yapmanız gerekir:

  1. TVP
  2. eski (1)
  3. damla
  4. yeniden oluşturun (1) orijinal adıyla
  5. altında kullanmak için yeni bir ad altında
  6. alter bağımlılıkları yeni TVP oluşturmak
  7. alter bağımlılıkları Benbuldum (4)
  8. damla (1)
+3

Teşekkür ederim, ama güçlük berbat. –

10

kullanmak, bağımlılıkları geçici olarak düşürerek ve sonra bunları yeniden oluşturarak süreci otomatikleştirmenin bir yolunu sunar.

Biraz değiştirdim.

1.You aşağıdaki prosedürü oluşturmalıdır:

-- 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 bir giriş parametresi olarak masa tipi adıyla çalıştırmak gerekir. Sonuçları grid formatında göster (çünkü metin formatı uzun metinleri kesebilir), tüm sonuç tablosunu seçin ve yeni bir sorgu penceresine kopyalayın.

+0

Bunu test ettiniz mi? – Shiva

+0

@Shiva - Evet yaptım. Benim için çalıştı. – BornToCode

+0

bu harikaydı. Bana çok zaman kazandırır – Keith

İlgili konular