【问题标题】:Must declare scalar variable - using cursors必须声明标量变量 - 使用游标
【发布时间】:2018-04-13 02:48:01
【问题描述】:

这听起来可能很愚蠢。但是我试图从两个表的比较中获取最后修改的日期值,但是我得到“必须声明标量变量@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

【问题讨论】:

    标签: tsql variables cursor scalar


    【解决方案1】:

    您可能应该使用基于集合的查询而不是游标和动态 sql,但为了快速而肮脏的修复,您需要将动态 SQL 字符串中的这部分 where a.Audit_Field=@pa 更改为 where a.Audit_Field='''+ @pa +''' 动态 sql 没有不知道 @pa 变量,因为它在自己的范围内运行。

    此外,您的 SQL 提示您在 audit_field 中使用逗号分隔值。 这是一件非常糟糕的事情 - 要了解更多信息,请阅读 Is storing a delimited list in a database column really that bad?,您会在其中看到很多原因,为什么这个问题的答案是绝对是的!

    如果您想要一些关于如何使用基于集合的查询而不是这种混乱的指导,请发布新查询或编辑此查询以包含示例数据,如DDL + DML,以及所需的结果。

    【讨论】:

    • 那行得通 :) 会调查这个并尝试自己做。感谢您的想法:)
    • 很高兴为您提供帮助 :-)
    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多