uando os cursores TSQL são a melhor ou a única opçã

Estou tendo este argumento sobre o uso de cursores no TSQL recentemente ...

Primeiro de tudo, eu não sou uma líder de torcida no debate. Mas toda vez que alguém dizcurso, sempre há um knucklehead (ou 50) que ataca com o obrigatório 'cursores são maus' mantra. Eu sei que o SQL-Server foi otimizado para operações baseadas em conjuntos, e talvez os cursores sejam realmente encarnados, mas se eu quisesse colocar um pensamento objetivo por trás disso ...

Aqui está a minha mente:

1) A única diferença entre cursores e operações de configuração é uma dasdesempenh?

Edita: Houve um bom argumento para não ser simplesmente uma questão de desempenho - como executar um único lote repetidamente para uma lista de IDs ou, alternativamente, executar texto SQL real armazenado em um campo de tabela - por linha.

2) Acompanhamento: faça cursoressempr executar pior?

EDITA: @Martin mostra um bom caso em que os Cursores superam as operações baseadas em conjuntos de maneira bastante dramática. Eu suspeito que isso não seria o tipo de coisa que você fariatambé frequentemente (antes de você recorrer a algum tipo de solução OLAP / Data Warehouse), mas mesmo assim parece um caso em que você realmente não podia viver sem um cursor.

- eferência aos valores de referência da T sugerindo cursorespoder mais competitivo do que as pessoas geralmente acredita
- eferência a otimizações de uso de memór for cursors desde o Sql-Server 2005

3) Há algum problema em que os cursores são mais adequados para resolver do que as operações baseadas em conjunto

EDITA: Operações baseadas em conjuntos literalmentenão pode Executerocedimentos armazenados, etc. (consulte a edição do item 1 acima
EDITA: As operações baseadas em conjuntos são exponencialmente mais lentas do que linha por linha quando se trata de agregação em grandes conjuntos de dado

Artigo do MSDN explicando a perspectiva deles deo mais comuroblemas que as pessoas recorrem a cursores (e alguma explicação de técnicas baseadas em conjuntos que funcionariam melhorMicrosoft diz (vagamente) no Referência do Transact SQL no MSDN @ 20: "... há momentos em que os resultados são melhor processados uma linha de cada vez", mas eles não dão exemplos dos casos a que se referem.

Principalmente, tenho a intenção de converter cursores em operações baseadas em conjunto no meu código antigo se / enquanto fizer alguma atualização significativa para vários aplicativos, desde que haja algo a ser ganho com isso. (Costumo ficar preguiçoso com a pureza muitas vezes - ou seja, se não estiver quebrado, não conserte.)

questionAnswers(4)

yourAnswerToTheQuestion