cuándo usar SET vs SELECT para asignar valores a variables en SQL Server

By: Atif Shehzad | Updated: 2009-11-25 | Comments (13) | Related: More > T-SQL

Problem

SET and SELECT se puede usar para asignar valores a variables a través de T-SQL. Ambos cumplen la tarea, pero en algunos escenarios se pueden producir resultados inesperados. En esta sugerencia explico las consideraciones para elegir entre los métodos SET y SELECT para asignar un valor a la variable.,

solución

en la mayoría de los casos SET y SELECT se pueden usar alternativamente sin ningún efecto.

a continuación se presentan algunos escenarios en los que se requiere consideración al elegir betweenSET o SELECT. Los Scripts que utilizan la base de datos de AdventureWorks se proporcionan para mayor clarificación.

Las Partes 1 y 2 se mencionan en los scripts a continuación. Sería mejor si ejecuta cada parte del script por separado para que pueda ver los resultados de cada método.,

devolver valores a través de una consulta

siempre que esté asignando un valor devuelto por consulta a una variable, SET aceptará y asignará un valor escalar (único) de una consulta. Mientras que SELECT podría aceptar valores multiplereturned. Pero después de aceptar varios valores a través de un comando SELECT, no tiene forma de rastrear qué valor está presente en la variable. El último valor devuelto en la lista rellenará la variable. Debido a esta situación, puede generar resultados esperados, ya que no se generaría ningún error o advertencia si se devolvieran multiplevalues al usar SELECT., Por lo tanto, si se pueden esperar varios valores, use la opción SET con la implementación adecuada de mecanismos de manejo de errores.

para aclarar más el concepto, ejecute el script # 1 en dos partes separadas para ver los resultados

La Parte 1 del script debe tener éxito. La variable se rellena con un conjunto singlevalue through. Pero en la parte 2 del script se producirá el siguiente mensaje de error y la instrucción SET no rellenará la variable cuando se devuelva más de un valor.

mensaje de Error generado para SET

por lo tanto SET prevented assignment of an ambiguous value.,

en el caso de SELECT, incluso si la consulta devuelve varios valores, no se generará ningún error y no habrá forma de rastrear que se devolvieron varios valores y qué valor está presente en la variable. Esto se demuestra en el siguiente guión.

ambas partes 1 y 2 fueron ejecutadas con éxito. En la parte 2, se han asignado y aceptado múltiples valores, sin saber qué valor realmente popularía la variable., Por lo tanto, cuando se espera La recuperación de múltiples valores, considere las diferencias de comportamiento entre SET y SELECT e implemente el manejo adecuado de errores para estas circunstancias.

asignar múltiples valores a múltiples variables

Si tiene que rellenar varias variables, en lugar de usar ESTADOS DE CONJUNTO separados cada vez, considere usar SELECT para rellenar todas las variables en una sola instrucción.Esto se puede usar para rellenar variables directamente o seleccionando valores de la base de datos.

considere el siguiente script comparando el uso de SELECT y SET.,

si está utilizando SET, entonces cada variable tendría que tener valores asignados individualmente a través de varias sentencias como se muestra a continuación.

obviamente SELECT es más eficiente que SET al asignar valores a multiplevariables en términos de sentencias ejecutadas, código y bytes de red.

Qué pasa si la variable no se rellena correctamente

si una variable no se rellena correctamente, el comportamiento de SET y Select sería diferente. La asignación fallida puede deberse a que no se ha devuelto ningún resultado o a cualquier valor no compatible asignado a la variable., En este caso, SELECT conservaría el previousvalue si lo hubiera, donde SET asignaría NULL. Debido a la funcionalidad de la diferencia, ambos pueden conducir a resultados inesperados y deben considerarse cuidadosamente.

esto se muestra en el siguiente 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 la parte 1 genera NULL cuando no se devuelve ningún valor para populatingvariable. Donde como parte 2 produce el valor anterior que se conserva después de failedassignment de la variable. Esta situación puede conducir a resultados inesperados y requiere consideración.,

seguir los estándares

usar SELECT puede parecer una mejor opción en escenarios específicos, pero tenga en cuenta que el uso de SELECT para asignar valores a variables no está incluido en los estándares Ansist. Si está siguiendo estándares para fines de migración de código, evite usar SELECT y use SET en su lugar.

conclusión

La mejor práctica sugiere no atenerse a un método. Dependiendo del escenario, es posible que desee usar tanto SET como SELECT.,

Los siguientes son algunos escenarios para usar SET

  • Si se le requiere asignar un solo valor directamente a la variable y noquery está involucrado para obtener el valor
  • se esperan asignaciones NULL (se devuelve NULL en el conjunto de resultados)
  • Los estándares están destinados a seguirse para cualquier migración planificada
  • se esperan resultados no escalares y se requiere que se manejen

el uso de SELECT es eficiente y flexible en los siguientes pocos casos.,

  • varias variables se rellenan asignando valores directamente
  • varias variables se rellenan con una sola fuente (tabla , vista)
  • menos codificación para asignar varias variables
  • Use esto si necesita obtener @@ROWCOUNT y @ERROR para la última instrucción ejecutada
pasos siguientes
  • haga clic aquí para ver cómo asignar y declarar variables a través de un solo Estado junto con otras nuevas mejoras de T-SQL en SQL Server 2008.,
  • haga Clic aquí para leer más sobre @@ROWCOUNT
  • haga Clic aquí para leer más sobre @@ERROR

Última actualización: 2009-11-25

Sobre el autor
Atif Shehzad es un apasionado de SQL Server DBA, revisor técnico y autor del artículo.ver todos mis consejos
recursos relacionados

  • Más consejos para desarrolladores de bases de datos…

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *