2011-12-22 10 views
20

intentar asignar una variable dentro de un if existe cláusula de TSQLAsignación de una variable dentro de una cláusula de si existe

DECLARE @myvar int 

IF EXISTS (SELECT @myvar = theTable.varIWant.....) 

pensé que esto iba a funcionar, pero al parecer no? O tal vez (más probable) lo estoy haciendo mal.

+1

Ok mi solución más simple que utilizo es @myvar SELECT = .... y luego hacer un IF (@myvar <> null) . Esto resuelve mi problema e incluso lo hace más lógico, pero aún estoy interesado en saber si puedo asignarlo. –

+1

Supongo que no, dado que la instrucción de asignación no devuelve un valor booleano que satisfaga IF EXISTS – Sparky

Respuesta

20

En mi instalación de SQL Server 2008 R2, simplemente no se compila. El analizador se queja de una sintaxis incorrecta cerca del =.

Creo que debe tener algo que ver con la asignación de valores de mezcla y la recuperación de datos en una sola instrucción SELECT, que no está permitida en SQL Server: puede tener uno u otro. Dado que, cuando se asignan valores, el conjunto de filas no se devuelve pero el predicado EXISTS espera que sea, la asignación no se puede permitir en ese contexto, por lo tanto, para evitar confusiones, tal vez la limitación se debe haber impuesto explícitamente.

Su solución, de la que está hablando en un comentario, es decente, pero podría no funcionar bien en el medio de un lote cuando la variable ya tiene un valor antes de la asignación. Así que probablemente utilice esta solución en su lugar:

SELECT @myvar = ... 
IF @@ROWCOUNT > 0 ... 

As per MSDN, la función del sistema @@ROWCOUNT devuelve el número de filas leídas por la consulta.

+0

+1 para usar '@@ ROWCOUNT' – rabudde

+0

Hmm, que es semánticamente mejor. ¿Esta o la respuesta de Michael Petter? –

+0

@ Jeff.Clark: Semánticamente, no estoy seguro. El mío tiene mucho sentido para mí y no veo ningún problema, desde el punto de vista lógico, con la opción propuesta por Michael Petter tampoco. Hay un problema potencial de un tipo diferente con su solución, y lo he expresado en mi respuesta. (Vea el párrafo donde estoy discutiendo la solución alternativa del OP, que es básicamente la misma sugerencia de Michael). –

1

No funcionará solo porque en EXISTS la construcción del servidor sql simplemente valida si existe alguna fila y no importa la columna de selección o la sección de asignación. Esto se hace para optimizar el rendimiento.

-2

¿Has probado la cuenta?

SELECT @Exists = CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END 
FROM [dbname].[dbo].[tableorviewname]; 
7

En lugar de hacer IF EXISTS, sólo podía hacer

DECLARE @myvar int 
SELECT @myvar = theTable.varIWant.....; 
IF @myvar IS NULL 
BEGIN... 
Cuestiones relacionadas