2009-03-14 11 views

Respuesta

6

Suponiendo SQL Server:

Usted tendría que utilizar SQL dinámico. Construya la cadena y luego llame a sp_executesql con la cadena.

Editar: Mejor aún, solo use declaraciones if para ejecutar la declaración apropiada y asignar el valor a una variable. Debería evitar SQL dinámico si es posible.

0

Dado que no se especifica qué servidor SQL que va en contra, esto será difícil de responder adecuadamente ....

Por lo Puedo decir que no podrás hacer esto ni contra MS SQL Server ni contra Interbase/Firebird. No puedo hablar por otros servidores de fondo, aunque ...

Marc

0

Creo que es bastante seguro decir que la respuesta es no hay manera. Y eso es independientemente del dialecto SQL.

22

No creo que eso sea posible. Por un lado, los optimizadores de consultas asumen una lista específica de elementos de tabla en la cláusula FROM.

La más sencilla solución que se me ocurre sería una unión entre las dos tablas:

SELECT md5 
FROM hr 
WHERE @clienttype = 'Employee' 
AND  current = 2 
UNION 
SELECT md5 
FROM other 
WHERE @clienttype = 'Member' 
AND  current = 2; 

Sólo la mitad de la unión podría ser cierto, dado el predicado @ClientType.

+0

lo general escribiría una sentencia if, pero cuando se utiliza esta estrategia combinada con una 'insertar en' me ahorra tener que escriba la parte de inserción varias veces, me encanta esta solución, gracias, lo haré de esta manera a partir de ahora cuando sea posible. :) –

+0

Solo tenga en cuenta que la condición 'WHERE' se ejecuta para cada fila de la tabla. Por lo tanto, puede no ser una opción si la condición es un poco más complicada y hay millones de filas. –

1

No, no puede elegir una tabla para realizar una consulta con una sentencia CASE. Las sentencias CASE solo van dentro de expresiones, como para el valor de una columna o como parte de su expresión WHERE.

Esto debe hacerlo, si usted está buscando para un solo valor:

IF @ClientType = 'Employee' BEGIN 
    SET @Source = (SELECT Md5 FROM HR WHERE Current = 2) 
END 
ELSE IF @ClientType = 'Member' BEGIN 
    SET @Source = (SELECT Md5 FROM Other WHERE Current = 2) 
END 
+0

Por "tanto tiempo" como este es, es el enfoque que tomaría (pero no me quedan votos: - /). Prefiero usar una herramienta para generar el SQL estáticamente (¿qué es, 3 líneas de Ruby o 1 línea de Perl? :-) vs. tratar con SQL dinámico (cuando necesito SQL dinámico, no encuentro nada más que odio por necesitando SQL dinámico). –

Cuestiones relacionadas