2016-01-06 50 views
1

創建數據類型我稱它接受一個用戶定義的表型的存儲過程dbo.NodeTableTypeSQL Server 2012的 - 從現有的表

ALTER PROCEDURE [dbo].[InsertNonExistingNode] 
    (@TableVariable dbo.NodeTableType READONLY) 

它似乎是多餘的,因爲dbo.NodeTableType是相同的實際的表在我的數據庫dbo.Nodes

  1. 難道我真的爲了不同的是它在我的存儲過程的參數來創建此數據類型?

  2. 如果#1的答案是「是」,那麼有沒有辦法通過將它指向表來創建這種數據類型?目前,我要創建這樣說:User Defined Types

    CREATE TYPE NodeTableType AS TABLE 
        (NodeTypeId SMALLINT NOT NULL, 
        Location NVARCHAR(50) NULL, 
        DisplayName NVARCHAR(100) NULL, 
        AccessLevel SMALLINT NOT NULL, 
        IsEnabled BIT NOT NULL, 
        CreatedOn DATETIME2(7) NULL, 
        CreatedBy NVARCHAR(150) NULL, 
        ModifiedOn DATETIME2(7) NULL, 
        ModifiedBy NVARCHAR(150) NULL, 
        NativeId BIGINT NOT NULL, 
        SourceId INT NOT NULL, 
        Name NVARCHAR(100) NOT NULL, 
        Alias NVARCHAR(100) NULL 
    ) 
    
+0

從表中創建一個類型並不困難。只需在桌面上編寫腳本並在開始時更改幾個字。是的,你必須定義類型才能通過它。 SQL如何知道它是什麼? –

回答

2

只有這樣,才能根據這個URL文檔定義一個用戶定義的表型是通過CREATE TYPE聲明。所以你不能使用這個表。

我建議堅持傳遞一個表值參數的標準做法,這個參數是用CREATE TYPE創建的。

可以使用下面概述的另一種方法,只要您不需要將表值參數傳遞給您的過程就可以存活,而且我不確定這是否可行。

在您的存儲過程中,您可以填充與原始NodeTableType類型相同類型的表變量。當然,你需要決定填充這個表變量的邏輯;我認爲這個邏輯只是一個簡單的例子,僅作爲一個例子NodeId < 10;在你的情況下,這個規則會有所不同,可能更復雜。

DECLARE @myTable dbo.NodeTableType; 
INSERT INTO @myTable( 
    NodeTypeId SMALLINT NOT NULL, 
    Location NVARCHAR(50) NULL, 
    DisplayName NVARCHAR(100) NULL, 
    AccessLevel SMALLINT NOT NULL, 
    IsEnabled BIT NOT NULL, 
    CreatedOn DATETIME2(7) NULL, 
    CreatedBy NVARCHAR(150) NULL, 
    ModifiedOn DATETIME2(7) NULL, 
    ModifiedBy NVARCHAR(150) NULL, 
    NativeId BIGINT NOT NULL, 
    SourceId INT NOT NULL, 
    Name NVARCHAR(100) NOT NULL, 
    Alias NVARCHAR(100) NULL) 
SELECT * from dbo.Nodes where NodeId < 10; 
--now you can use @myTable rather than @TableVariable 
--in your stored procedure