匿名用户表类型作为T-SQL中的参数类型

时间:2016-11-28 10:16:18

标签: sql-server tsql

我为项目计划了大量存储过程,这些存储过程都使用用户提供的数据执行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”附近的语法不正确。

0 个答案:

没有答案