Quando usar o CONJUNTO vs SELECIONE quando da atribuição de valores a variáveis no SQL Server

Por: Atif Shehzad | Atualizado em: 2009-11-25 | Comments (13) | Relacionados: Mais > T-SQL

Problema

DEFINIR e SELECIONAR pode ser usado para atribuir valores a variáveis através de T-SQL. Ambos completam a tarefa, mas em alguns cenários podem ser produzidos resultados inesperados. In thistip I elabore on the considerations for choosing between the SET and SELECT methods for assigning a value to variable.,

solução

na maioria dos casos, pode ser usada alternativamente sem qualquer efeito.

A seguir estão alguns cenários quando a consideração é necessária na escolha entre o conjunto ou a seleção. Scripts usando a base de dados AdventureWorks são fornecidos para maior clarificação.

As partes 1 e 2 são mencionadas nos scripts abaixo. Seria melhor se você executar cada parte do script separadamente para que você possa ver os resultados para cada método.,

devolvendo valores através de uma consulta

sempre que você estiver atribuindo um valor de consulta retornada a uma variável, O SET aceitará e atribuirá um valor escalar (único) de uma consulta. Enquanto a SELECT podia aceitar valores multiplereturned. Mas depois de aceitar vários valores através de um comando SELECT você não tem como rastrear qual valor está presente na variável. O último valor retornado na lista irá povoar a variável. Devido a esta situação, ele pode levar os resultados esperados toun, pois não haveria erro ou aviso gerado se multiplevalues foram retornados ao usar SELECT., Assim, se vários valores podem ser esperados use a opção SET com a implementação adequada de mecanismos de manipulação de erros.

para clarificar ainda mais o conceito, execute o script # 1 em duas partes separadas para ver os resultados

Parte 1 do script deve ser bem sucedido. A variável é povoada com um único valor através do conjunto. Mas na parte 2 do script a seguinte mensagem de erro será produzida e a declaração SET não irá povoar a variável quando mais de um valor é retornado.

mensagem de erro gerada para o Conjunto

deste modo, definir impediu a atribuição de um valor Ambíguo.,

Em caso de seleção, mesmo que vários valores sejam retornados pela consulta, nenhum erro será gerado e não haverá nenhuma maneira de rastrear que vários valores foram retornados e que valor está presente na variável. Isto é demonstrado no seguinte script.ambas as partes 1 e 2 foram executadas com sucesso. Na parte 2, foram atribuídos e aceites múltiplos valores, sem saber qual o valor que realmente popularia a variável., Assim, quando a recuperação de vários valores é esperada, então considere as diferenças comportamentais entre o conjunto e selecione e implemente o handling de erro adequado para estas circunstâncias.

atribuir vários valores a múltiplas variáveis

Se tiver de povoar várias variáveis, em vez de usar um conjunto separado de statementseach time considera usar SELECT para popularizar todas as variáveis numa única declaração.Isto pode ser usado para popularizar variáveis diretamente ou selecionando valores de banco de dados.

considere o seguinte script comparando o uso de selecionar e definir.,

Se estiver a usar o conjunto, então cada variável terá de receber valores individualizados através de várias declarações, como mostrado abaixo.

obviamente, a seleção é mais eficiente do que o conjunto, atribuindo valores a multiplevariáveis em termos de declarações executadas, códigos e bytes de rede.

e se a variável não for povoada com sucesso

Se uma variável não for povoada com sucesso, então o comportamento para definir e seleccionar será diferente. A atribuição falhada pode ser devido a nenhum resultado retornado ou a qualquer não-compatibilização atribuída à variável., Neste caso, selecione preservaria o valor anterior, se houver, onde SET atribuiria NULL. Devido à funcionalidade da diferença, ambos podem levar a resultados inesperados e devem ser considerados cuidadosamente.

Esta é mostrado na seguinte script

--Script # 5 - Behavior of SET and SELECT for missing valueUSE AdventureWorksGO -- Part 1. Observe behavior of missing result with SETDECLARE @var1 VARCHAR(20)SET @var1 = 'Value 1 Assigned'PRINT @var1SET @var1 = (SELECT Color FROM Production.Product WHERE ProductID = 32022)PRINT @var1GO -- Part 1. Observe behavior of missing result with SELECTDECLARE @var1 VARCHAR(20)SELECT @var1 = 'Value 1 Assigned'PRINT @var1 SELECT @var1 = Color FROM Production.Product WHERE ProductID = 32023PRINT @var1GO

podemos ver que a parte 1 gera NULO quando nenhum valor é retornado para populatingvariable. Em que, como parte 2, produz o valor anterior que é preservado após a não classificação da variável. Esta situação pode conduzir a resultados inesperados e exigir uma reflexão.,

seguindo os padrões

Usando SELECT pode parecer uma melhor escolha em cenários específicos, mas deve estar ciente de que o uso SELECT para atribuir valores a variáveis não está incluído nos ANSIstandards. Se você está seguindo os padrões para fins de migração de código, em seguida, evitar selecionar e usar SET em vez.

a conclusão

as melhores práticas sugerem que não se deve cingir a um método. Dependendo do cenário, você pode querer usar ambos SET ou selecionar.,

a Seguir estão alguns cenários para o uso do CONJUNTO

  • Se você é obrigado a atribuir um valor diretamente a variável e cláusulas noquery envolvidos para obtenção de valor
  • NULL atribuições são esperados (NULL retornado no conjunto de resultados)
  • as Normas são feitas para serem siga para qualquer migração planejada
  • Não escalar os resultados são esperados e devem ser manipulados

Usando SELECT é eficiente e flexível em alguns casos.,

  • Várias variáveis que estão a ser preenchido através da atribuição de valores diretamente
  • Várias variáveis que estão a ser preenchido por uma única fonte (tabela , modo de exibição)
  • Menos de codificação para a atribuição de várias variáveis
  • Use isto se você necessitar de @@ROWCOUNT e @ERRO para a última instrução executada
Próximos Passos
  • Clique aqui para ver como atribuir e a declaração de variáveis através único statementalong com outras novas T-SQL aprimoramentos no SQL Server 2008.,
  • Clique aqui para ler mais sobre o @@ROWCOUNT
  • Clique aqui para ler mais sobre o @@ERRO

Última actualização: 2009-11-25

Sobre o autor
Atif Shehzad é um apaixonado DBA SQL Server, revisor técnico e autor do artigo.
View all my tips
Related Resources

  • More Database Developer Tips…

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *