我有一个存储过程,它接受一个名为dbo.NodeTableType
的用户定义的表类型:
ALTER PROCEDURE [dbo].[InsertNonExistingNode]
(@TableVariable dbo.NodeTableType READONLY)
这似乎是多余的,因为dbo.NodeTableType
与我的数据库dbo.Nodes
中的实际表相同。
我是否真的必须创建此数据类型才能将其作为存储过程中的参数除外?
如果对#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 :(得分:2)
定义用户定义的表类型的唯一方法是根据此URL上的文档User Defined Types通过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