无法将TVP与动态SQL查询一起使用

时间:2015-02-08 06:51:19

标签: sql-server

我正在尝试使用动态查询在TVP(表值参数)变量中插入值并将TVP值传递给过程。 我得到错误为 - 消息1087,级别15,状态2,第1行 必须声明表变量“@EmpDetailsTVP1”。 不明白我错在哪里,我已经宣布TVP在上面 这里  ee12345是TVP表参数 cp1122334是proc

declare @vsql1 as nvarchar(max)
DECLARE @EmpDetailsTVP1 AS ee12345
set @vsql1='INSERT INTO @EmpDetailsTVP1(ei,en,enm)
           select EmpId1, EmpName1, [Role1] from EmployeeDetails2 '
exec sys.sp_executesql
    @vsql1
EXEC cp1122334 @EmpDetailsTVP 

2 个答案:

答案 0 :(得分:0)

表变量的范围是声明的范围。加载表变量,然后将其作为TVP传递。只需省略动态SQL,使其与declare:

处于相同的范围内
DECLARE @vsql1 AS nvarchar(MAX);
DECLARE @EmpDetailsTVP1 AS ee12345;
INSERT INTO @EmpDetailsTVP1(ei,en,enm)
    SELECT EmpId1, EmpName1, [Role1] FROM dbo.EmployeeDetails2;
EXEC cp1122334 @EmpDetailsTVP;

答案 1 :(得分:0)

Dynamic query将有不同的session,因此您无法使用在动态查询之外声明的表变量,

相反,您可以将temp table创建为TVP的相同结构。

Create table #temp(ei datatype,en datatype...) -- As like `TVP(ee12345)`

declare @vsql1 as nvarchar(max)
DECLARE @EmpDetailsTVP1 AS ee12345

插入temp table(#temp)而不是TVP,可以在动态查询

中访问
set @vsql1='INSERT INTO #temp(ei,en,enm)
           select EmpId1, EmpName1, [Role1] from EmployeeDetails2 '
exec sys.sp_executesql @vsql1

现在将记录重新插入TVP

Insert into @EmpDetailsTVP (ei,en,enm)
select ei,en,enm from #temp

EXEC cp1122334 @EmpDetailsTVP