如何在动态查询中使用 Table 值参数
How to use Table -Valued Parameter with Dynamic qry
我正在使用 Table - 用于使用以下代码构建动态查询的值参数
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;
这给我错误
必须声明 table 变量“@Details_N”
没有找到我做错的地方
Table 变量的范围是针对特定批次(相同的上下文),而临时 table 是针对 SPID。 EXEC 命令在不同的上下文中运行。使用临时 tables 代替:
Declare @tblName2 as nvarchar(1000) ='#Details_N'
CREATE TABLE #Details_N (Pk int)
Insert into #Details_N(Pk)
select PK from @Details
在动态查询中,不能使用在外部声明的table变量。请改用 temp table。你也把它复杂化了一点,这是一个更清晰的版本
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
语法,旧式逗号分隔连接已弃用
我正在使用 Table - 用于使用以下代码构建动态查询的值参数
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;
这给我错误
必须声明 table 变量“@Details_N”
没有找到我做错的地方
Table 变量的范围是针对特定批次(相同的上下文),而临时 table 是针对 SPID。 EXEC 命令在不同的上下文中运行。使用临时 tables 代替:
Declare @tblName2 as nvarchar(1000) ='#Details_N'
CREATE TABLE #Details_N (Pk int)
Insert into #Details_N(Pk)
select PK from @Details
在动态查询中,不能使用在外部声明的table变量。请改用 temp table。你也把它复杂化了一点,这是一个更清晰的版本
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
语法,旧式逗号分隔连接已弃用