我正在尝试使用动态查询在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
答案 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