我为项目计划了大量存储过程,这些存储过程都使用用户提供的数据执行MERGE
操作,这些数据通过TABLE
参数传递到存储过程。
这样的语法是:
CREATE PROCEDURE dbo.MergeFoo
@values dbo.FooTableType READONLY
AS
BEGIN
MERGE dbo.Foo AS [target]
USING @values AS [source] ON
-- yada
WHEN MATCHED THEN
-- yada
END
据我所知,这需要单独声明每个表类型:
CREATE TYPE dbo.FooTableType AS TABLE (
Col1 int NOT NULL,
Col2 nvarchar(50) NULL
)
这是一个问题,因为这些存储过程中的每一个都采用了个性化的表类型,因此每个存储过程都需要自己的表类型 - 这会妨碍开发人员的工作效率(我注意到,如果一个表,我也无法编辑表类型)存储过程正在引用它 - 您必须删除存储过程,编辑类型,然后重新创建存储过程。
但是如果你有一个表值变量,你可以匿名声明表类型,如下所示:
DECLARE @fooTable TABLE (
Col1 int NOT NULL,
Col2 nvarchar(50) NULL
)
是否可以将匿名表类型作为存储过程参数,如下所示:
CREATE PROCEDURE dbo.MergeFoo
@values TABLE (
Col1 int NOT NULL,
Col2 nvarchar(50) NULL
) READONLY
AS
BEGIN
-- yada
当然,这种语法不起作用,我收到语法错误:
Msg 156,Level 15,State 1,Procedure MergeFoo,Line 2 [Batch Start Line 0]
关键字“TABLE”附近的语法不正确。