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)';
我在将 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)';