Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/pandas/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 无法将TVP与动态SQL查询一起使用_Sql Server - Fatal编程技术网

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

Sql server 无法将TVP与动态SQL查询一起使用,sql-server,Sql Server,我试图使用动态查询在TVP(表值参数)变量中插入值,并将TVP值传递到过程中。 我得到的错误是--Msg 1087,15级,状态2,第1行 必须声明表变量“@EmpDetailsTVP1”。 不明白我错在哪里,我已经在上面声明了TVP 在这里 ee12345是TVP表参数 cp1122334是程序 declare @vsql1 as nvarchar(max) DECLARE @EmpDetailsTVP1 AS ee12345 set @vsql1='INSERT INTO @EmpDetai

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

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 

表变量的范围是在其中声明的范围。加载表格变量,然后将其作为TVP传递。只需省略动态SQL,使其与声明处于同一范围内:

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;

动态查询
将有不同的
会话
,因此不能使用在动态查询之外声明的表变量

相反,您可以创建一个与TVP结构相同的
temp表

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

declare @vsql1 as nvarchar(max)
DECLARE @EmpDetailsTVP1 AS ee12345
插入到
temp表(#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 

thanx的解决方案。但我有两个疑问1--我习惯于将值传递给进程外的TVP,这里我将值传递给进程内的TVP,但我之前没有这样做。行吗?2--由于TVp在SQL SERVER中是只读的,如果我想将其与动态SQL一起使用,它超出了您建议的解决方案的范围,但是没有方法在过程中使其全局可访问。例如使用#或##使其全局可访问,但此过程中无法插入2100多个参数way@ThanxNoDisplayName您的解决方案有效。现在我对TVp作用域有了更好的理解,但我有一个疑问——我过去常常在进程外将值传递给TVp,这里我将值传递给进程内的TVp,但我之前没有做过这样的练习。它会不会像你建议的那样,通过sme ame的方式实现全球化?先是临时的,然后是TVP,最后是proc???