Table sp_executesql 参数列表中的变量

Table variable in sp_executesql parameter list

我在将 table 变量发送到 sp_executesql 参数列表时遇到问题。

我的Table变量:

declare @MemberCoverageIds table (CoverageId ID_t)

insert into @MemberCoverageIds( CoverageId) select MemberCoverageId from MemberCoverages where MemberNumber = @FulfillmentEntityIdentifier

我的 where 子句使用 table 变量:

@WhereClause = @WhereClause + 'and F.FulfillmentEntityId in (select CoverageId from @MemberCoverageIds) '

它是我的 FinalSQL 变量的一部分,它具有语句的其余部分:

select @FinalSQL = @InsertClause + @SelectClause + @JoinClause + @WhereClause

然后我执行:

exec sp_executesql @FinalSQL,
                    N'  @FulfillmentEntityIdentifier    RefNumber_t,
                        @MemberCoverageIds              ReadOnly,
                        @EntityId                       Id_t,
                        @FulfillmentEntityType          Code_t,
                        @FulfillmentDocumentType        Code_t,
                        @FulfillmentMethod              Code_t',
                        @FulfillmentEntityIdentifier    = @FulfillmentEntityIdentifier,
                        @MemberCoverageIds              = @MemberCoverageIds,
                        @EntityId                       = @EntityId,
                        @FulfillmentEntityType          = @FulfillmentEntityType,
                        @FulfillmentDocumentType        = @FulfillmentDocumentType,
                        @FulfillmentMethod              = @FulfillmentMethod

然后我从该执行中收到意外错误。我知道它是 @MemberCoverages table 变量,因为它在我添加它之前就起作用了。我的问题是在参数列表中发送 table 变量的正确语法是什么?我必须在参数列表中声明它吗?

您需要实际创建 table 变量作为类型:

create type dbo.myTableType as table (id int)

然后您可以将它用作 sp_executesql 的类型化参数:

declare @m dbo.myTableType;
insert @m values (1), (2)

exec sp_executesql 
    N'select 99 where 1 in (select id from @m)', 
    N'@m dbo.myTableType readonly', 
    @m

如果不想创建新类型,可以使用#temp table:

declare @t table(id int);
insert @t values (1), (2);
select * into #t from @t;

exec sp_executesql N'select 99 where 1 in (select id from #t)';