【问题标题】:How to use Table -Valued Parameter with Dynamic qry如何在动态查询中使用表值参数
【发布时间】:2018-01-25 08:27:15
【问题描述】:

我正在使用 Table - Valued Parameter 使用以下代码构建动态查询

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”

没有找到我做错的地方

【问题讨论】:

  • 我删除了我的答案,因为我发布得太快了。一个小评论是,在动态 SQL 中,您使用的是过时的 JOIN。 ANSI 标准是使用 SELECT * FROM TableA JOIN TableB ON TableA.ID = TableB.TableAID 之类的东西。

标签: sql sql-server sql-server-2012 table-valued-parameters dynamicquery


【解决方案1】:

在动态查询内部,不能使用外部声明的表变量。请改用临时表。你也太复杂了,这里有一个更干净的版本

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 语法,旧式逗号分隔连接已弃用

【讨论】:

    【解决方案2】:

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

    Declare @tblName2 as nvarchar(1000) ='#Details_N'  
    
    CREATE TABLE  #Details_N (Pk int)
    Insert into #Details_N(Pk) 
    select PK from @Details
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-22
      • 2021-12-05
      • 2019-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多