必须声明标量变量 - 使用游标
Must declare scalar variable - using cursors
这听起来可能很傻。但是我试图从两个表的比较中获取最后修改日期值,但是我得到“必须声明标量变量@pa”错误。我有更多的列,这就是我使用游标的原因检查
declare @pa varchar(50)
declare audit_cur cursor for
select distinct audit_field
from #Iam
where concat(',',@af,',') like concat('%,',audit_field,',%')
OPEN audit_cur
FETCH NEXT FROM audit_cur into @pa
declare @cmd varchar(1000)
WHILE @@FETCH_STATUS = 0
BEGIN
set @cmd=concat('SELECT a.A_n,i.audit_field,a.',@pa,' field_value,i.field_after
FROM #Iam_audit a
JOIN (Select a.A_n, a.field_after,audit_field
from #iam a(nolock)
inner join (Select a_n, max(Modified_Date) as maxdate
from #iam a2(nolock)
where a2.Audit_field=@pa
group by a_n
) as aa on aa.a_n = a.a_n and aa.maxdate=a.modified_Date
where a.Audit_Field=@pa ) i
ON i.audit_field=''',@pa,''' AND i.A_n=a.A_n AND a.',@pa,'<>i.field_after')
print @cmd -- for debug
exec(@cmd)
FETCH NEXT FROM audit_cur into @pa
END
CLOSE audit_cur
DEALLOCATE audit_cur
您可能应该使用基于集合的查询而不是游标和动态 sql,但是为了快速而肮脏的修复,您需要在动态 [=26] 中更改此部分 where a.Audit_Field=@pa
=] string to where a.Audit_Field='''+ @pa +'''
动态 sql 不知道 @pa
变量,因为它在自己的范围内运行。
此外,您的 SQL 提示您在 audit_field
中使用逗号分隔值。
这是一件非常糟糕的事情 - 有关更多信息,请阅读 Is storing a delimited list in a database column really that bad?,在那里您会看到很多原因,为什么这个问题的答案是 绝对是!
如果您想了解如何使用基于集合的查询而不是这个乱七八糟的问题,请 post 一个新查询或编辑此查询以将示例数据包含在 DDL + DML 中,并根据需要结果。
这听起来可能很傻。但是我试图从两个表的比较中获取最后修改日期值,但是我得到“必须声明标量变量@pa”错误。我有更多的列,这就是我使用游标的原因检查
declare @pa varchar(50)
declare audit_cur cursor for
select distinct audit_field
from #Iam
where concat(',',@af,',') like concat('%,',audit_field,',%')
OPEN audit_cur
FETCH NEXT FROM audit_cur into @pa
declare @cmd varchar(1000)
WHILE @@FETCH_STATUS = 0
BEGIN
set @cmd=concat('SELECT a.A_n,i.audit_field,a.',@pa,' field_value,i.field_after
FROM #Iam_audit a
JOIN (Select a.A_n, a.field_after,audit_field
from #iam a(nolock)
inner join (Select a_n, max(Modified_Date) as maxdate
from #iam a2(nolock)
where a2.Audit_field=@pa
group by a_n
) as aa on aa.a_n = a.a_n and aa.maxdate=a.modified_Date
where a.Audit_Field=@pa ) i
ON i.audit_field=''',@pa,''' AND i.A_n=a.A_n AND a.',@pa,'<>i.field_after')
print @cmd -- for debug
exec(@cmd)
FETCH NEXT FROM audit_cur into @pa
END
CLOSE audit_cur
DEALLOCATE audit_cur
您可能应该使用基于集合的查询而不是游标和动态 sql,但是为了快速而肮脏的修复,您需要在动态 [=26] 中更改此部分 where a.Audit_Field=@pa
=] string to where a.Audit_Field='''+ @pa +'''
动态 sql 不知道 @pa
变量,因为它在自己的范围内运行。
此外,您的 SQL 提示您在 audit_field
中使用逗号分隔值。
这是一件非常糟糕的事情 - 有关更多信息,请阅读 Is storing a delimited list in a database column really that bad?,在那里您会看到很多原因,为什么这个问题的答案是 绝对是!
如果您想了解如何使用基于集合的查询而不是这个乱七八糟的问题,请 post 一个新查询或编辑此查询以将示例数据包含在 DDL + DML 中,并根据需要结果。