2016-01-06 5 views
1

У меня есть хранимая процедура, которая принимает определенный пользователем тип таблицы называется dbo.NodeTableType:SQL Server 2012 - Создание типа данных из существующей таблицы

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

Это кажется излишним, потому что dbo.NodeTableType идентична реальной таблице в моя база данных dbo.Nodes.

  1. Должен ли я создать этот тип данных, чтобы исключить его в качестве параметра в моей хранимой процедуре?

  2. Если ответ на # 1 есть «Да», то есть ли способ создать этот тип данных, указав его на стол? В настоящее время, я должен создать его таким образом:

    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

Единственный способ определить определенный пользователем тип таблицы через CREATE TYPE заявление в соответствии с документацией по этому адресу: User Defined Types. Поэтому вы не можете использовать таблицу для этого.

Я бы рекомендовал придерживаться стандартной практики передачи значения параметра таблицы, который был создан с помощью 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 
Смежные вопросы