我想迭代一个表/视图,然后根据某些条件启动一些流程(例如,运行一个作业,发送一封电子邮件)。
我的任意约束是我想在数据库本身内部执行此操作,在存储的proc,触发器等上使用T-SQL。
这种情况是否需要游标,或者我是否可以利用其他一些本机T-SQL基于行的操作?
答案 0 :(得分:1)
你最好的选择是光标。 SQL是基于声明性和基于集合的,任何可能发现的尝试强制SQL执行命令行面向操作的解决方法都是不可靠的并且可能会中断。例如。优化器可能会从执行中删除您的“操作”,或者以奇怪的顺序或意外的次数执行操作。
一般的坏名称游标得到的是它们被部署而不是基于集合的操作(比如执行计算和更新,或返回报告),因为开发人员没有找到一种面向集合的方式来执行相同的功能。但对于非SQL操作(即启动进程),它们是合适的。
您也可以在游标主题上使用一些变体,例如客户端迭代结果集。这与光标非常相似,尽管没有使用显式游标。
答案 1 :(得分:1)
执行此操作的标准方法是SSIS。只需使用Execute SQL任务获取行,并使用For Each任务容器每行迭代一次。在容器内部,运行您喜欢的任何任务,他们将可以访问每行的列。
答案 2 :(得分:0)
如果您打算使用电子邮件地址(或类似的基于行的操作)向每条记录发送电子邮件,那么您确实打算使用游标。
在SQL本身中没有其他“基于行的”操作(尽管我喜欢John建议调查SSIS - 只要你有SQL Server Standard或Enterprise)。但是,如果您正在进行求和,搜索或任何其他类型的操作,然后在完成整个选择集后启动事件,那么您肯定不会使用游标。您知道 - 游标通常被认为是解决SQL Server问题的“最后手段”。
答案 3 :(得分:0)
当我需要迭代查询的结果集时,我想到的第一个想法是使用游标。是的,这是一种快速而肮脏的编程方式。但游标也有挫折 - 它们会产生间接费用,而且可能是性能瓶颈。
使用游标还有其他选择。您可以尝试使用带有标识列的临时表。将表复制到临时表并使用while循环迭代行。然后根据条件调用您的存储过程。
在此处,请查看此链接以了解游标的替代方法 - http://searchsqlserver.techtarget.com/tip/0,289483,sid87_gci1339242,00.html
欢呼声