繁体   English   中英

如何在动态qry中使用表值参数

[英]How to use Table -Valued Parameter with Dynamic qry

我正在使用表-值参数使用以下代码来构建dyNamic查询

AlTER PROCEDURE [dbo].[ABC]  
     @tblName Varchar(1000), 
     @Details ABC_TYPE Readonly


AS 

   BEGIN

   Declare @PK as nvarchar(1000)
   Declare @SyncFlag as nvarchar(1) ='S'
   Declare @SelectCommand as nvarchar(1200)
   Declare @tblName2 as nvarchar(1000) ='@Details_N'    


  Set @PK = 'PK'


  Declare @Details_N as table (Pk int)
  Insert into @Details_N(Pk) 
  select PK from @Details

  set @SelectCommand =   'Update A ' + ' set A.Sync_Flag ='''+ @SyncFlag + ''' From '+ @tblName + ' A, '  + @tblName2 + ' B ' +
  ' where A.' + @PK +'='+  'B.PK' 

  EXEC sp_executesql @SelectCommand;

这给我错误

必须声明表变量“ @Details_N”

找不到我在哪里做错了

表变量的范围用于特定批次(相同的上下文),而临时表的范围用于SPID。 EXEC命令在不同的上下文中运行。 改用临时表:

Declare @tblName2 as nvarchar(1000) ='#Details_N'  

CREATE TABLE  #Details_N (Pk int)
Insert into #Details_N(Pk) 
select PK from @Details

在动态查询内部,不能使用在外部声明的表变量。 请改用临时表。 另外,您对它的复杂程度也不太高,这是一个更干净的版本

DECLARE @SyncFlag AS NVARCHAR(1) ='S'
DECLARE @SelectCommand AS NVARCHAR(1200)

CREATE TABLE #Details_N(Pk INT)

INSERT INTO #Details_N(Pk)
SELECT PK
FROM   @Details

SET @SelectCommand = 'Update A ' + ' set A.Sync_Flag = @SyncFlag 
                        From '+ Quotename(@tblName) + ' A 
                        inner join #Details_N B '+ 'on A.PK =' + 'B.PK'

EXEC Sp_executesql
  @SelectCommand,
  N'@SyncFlag NVARCHAR(1)',
  @SyncFlag 

开始使用INNER JOIN语法,不建议使用旧式逗号分隔的连接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM