2009-01-29 9 views
7

Estoy intentando escribir un procedimiento almacenado y, dependiendo de un cierto valor de columna, deseo poder cambiar la tabla de la que selecciono. Voy a tratar de dar un ejemplo:Cambiando dinámicamente la tabla para seleccionar con la sentencia SQL CASE

SELECT ItemNumber, 
     ItemType, 
     Description 
FROM 

CASE ItemType 
WHEN 'A' THEN TableA 
ELSE TableB 
END 

WHERE 

CASE ItemType 
WHEN 'A' THEN ItemNumber = @itemNumber 
ELSE PartNumber = @itemNumber 
END 

Como se puede ver, no sólo estoy cambiando dinámicamente la tabla de selecciono, pero dado que estas dos tablas se hicieron en dos momentos diferentes por dos personas diferentes, la los nombres de las columnas también son diferentes.

Entonces, mi pregunta es: ¿Cuál es la mejor manera de lograr esto, ya que SQL Server no parece que me gusta mi consulta que he construido.

Si cualquiera que vea lo que estoy tratando de hacer puede sugerir una mejor manera de hacer esto, sería todo oídos :-)

+0

Si bien las personas suelen suponer "SQL Server" == "MS SQL Server", es mejor si aclara esto en la pregunta y en las etiquetas. Estoy cambiando las etiquetas, revertir si estoy equivocado. –

+4

sqlserver es la etiqueta para Microsoft SQL Server. Actualmente no hay otro producto con ese nombre, y es la única etiqueta útil en SO para ello. –

Respuesta

5

No puede utilizar CASE declaración de cláusula, pero se puede utilizar el siguiente lugar:

SELECT itemnumber, itemtype, description 
    FROM tablea 
WHERE itemnumber = @itemnumber AND itemtype = 'A' 
UNION ALL 
SELECT itemnumber, itemtype, description 
    FROM tableb 
WHERE partnumber = @itemnumber AND itemtype <> 'A' 
+0

Quise decir FROM cláusula – user34850

0

Usted es mejor de utilizar consulta UNION para combinar las tablas en primer lugar, y luego SELECCIONAR.

Además, puede considerar crear una vista para una de las tablas, por lo que solo extrae las columnas que necesita al renombrarlas, luego UNION, y luego seleccionar desde UNION.

O utilice una tabla temporal para almacenar el resultado de cada consulta. Puso la creación de la tabla temporal en un caso (pseudocódigo, no probado):

CASE @itemType 
    WHEN 'A' 
     SELECT ACol1 AS Col1, ACol2 AS Col2 
     FROM TABLE_A 
     INTO #tempTable 
     WHERE ItemNumber = @itemNumber 
    ELSE 
     SELECT BCol1 AS Col1, BCol2 AS Col2 
     FROM TABLE_B 
     INTO #tempTable 
     WHERE PartNumber = @itemNumber 
END 

SELECT * FROM #tempTable 
3

usted podría intentar la construcción de la sentencia de SQL dinámico como una cadena, y luego llamar al procedimiento almacenado sp_executesql para ejecutar la cadena.

Consulte here para obtener más información y ejemplos.

+0

Dudo que el SQL dinámico sea realmente necesario aquí a menos que el esquema sea aún más patológico. –

+0

Acepto que el SP tiene un diseño realmente malo, pero creo que esta es la solución más fácil para el problema propuesto. –

+0

No creo que el problema se haya especificado lo suficiente como para determinar que no se puede resolver primero con SQL básico. El SQL dinámico no se debe considerar en general hasta que el obstáculo para el SQL ordinario indique que es la elección correcta. –

1

Realmente no está explicando de dónde viene ItemType. Como se sugiere, UNION podría ser aplicable si solo está combinando dos tablas.

Aquí hay otra posibilidad que puede referirse a su problema:

SELECT ItemNumber, 
     ItemType, 
     COALESCE(TableA.Description, TableB.Description) AS Description 
FROM Items 
LEFT JOIN TableA 
    ON Items.ItemType = 'A' 
    AND TableA.ItemNumber = Items.ItemNumber 
LEFT JOIN TableB 
    ON Items.ItemType <> 'A' 
    AND TableB.ItemNumber = Items.ItemNumber 
3

No estoy seguro por qué quieres hacer cosas en una declaración SQL. No soy una persona de SQL Server, pero en un procedimiento almacenado de Oracle podrías escribir algo como esto

If itemtype = 'A' 
Then 
<statement for table A> 
Else 
<statement for Table B> 
End if 

Algo como esto debería funcionar en SQL Server, también ... ¿alguien podría expandir esto?

+0

Eso es lo que haría también – HLGEM

Cuestiones relacionadas