Parece que las #temptables creadas mediante SQL dinámico a través del método de cadena EXECUTE tienen un alcance diferente y no pueden ser referenciadas por SQL "fijas" en el mismo procedimiento almacenado. Sin embargo, puedo hacer referencia a una tabla temporal creada por una declaración de SQL dinámico en una SQL dinámica de subsecuencia, pero parece que un procedimiento almacenado no devuelve un resultado de consulta a un cliente llamante a menos que se solucione el SQL.Tablas dinámicas y SQL dinámicas de T-SQL
Un escenario simple de 2 tablas: Tengo 2 tablas. Vamos a llamarlos Pedidos y Artículos. El pedido tiene una clave principal de OrderId y Items tiene una clave principal de ItemId. Items.OrderId es la clave externa para identificar el pedido principal. Una orden puede tener de 1 a n elementos.
Deseo poder proporcionar al usuario una interfaz de tipo "creador de consultas" muy flexible para permitirle al usuario seleccionar qué elementos desea ver. Los criterios de filtro pueden basarse en campos de la tabla Elementos y/o de la tabla de pedidos principal. Si un artículo cumple con la condición de filtro, que incluye una condición en el pedido principal, si existe, el elemento debe devolverse en la consulta, así como en el pedido principal.
Por lo general, supongo que la mayoría de las personas construiría una unión entre la tabla de elementos y las tablas de pedidos principales. Me gustaría realizar 2 consultas separadas en su lugar. Uno para devolver todos los elementos calificados y el otro para devolver todos los pedidos principales distintos. La razón es doble y puede o no estar de acuerdo.
La primera razón es que necesito consultar todas las columnas en la tabla de pedidos principal y si hice una sola consulta para unirme a la tabla de Pedidos en la tabla Artículos, estaría reubicando la información del pedido varias veces. Dado que normalmente hay una gran cantidad de artículos por pedido, me gustaría evitar esto porque daría lugar a que se transfieran muchos más datos a un cliente gordo. En cambio, como se mencionó, me gustaría devolver las dos tablas de manera individual en un conjunto de datos y usar las dos tablas para completar un pedido personalizado y objetos de cliente secundarios. (Aún no sé lo suficiente sobre LINQ o Entity Framework. Construyo mis objetos a mano). La segunda razón por la que me gustaría devolver dos tablas en lugar de una es porque ya tengo otro procedimiento que devuelve todos los artículos para un OrderId dado junto con el orden principal y me gustaría usar el mismo método de dos tablas para que podría reutilizar el código del cliente para rellenar mis objetos ordenados de Cliente y Cliente de las 2 tablas de datos devueltas.
lo que esperaba hacer era esto:
Construir una cadena SQL dinámico en el cliente, que se une a la tabla de pedidos a la mesa y filtros apropiados en cada tabla de artículos según lo especificado por el filtro personalizado creado en el Winform aplicación fat-client. La acumulación de SQL en el cliente se habría visto algo como esto:
TempSQL = "
INSERT INTO #ItemsToQuery
OrderId, ItemsId
FROM
Orders, Items
WHERE
Orders.OrderID = Items.OrderId AND
/* Some unpredictable Order filters go here */
AND
/* Some unpredictable Items filters go here */
"
Entonces, yo llamaría un procedimiento almacenado,
CREATE PROCEDURE GetItemsAndOrders(@tempSql as text)
Execute (@tempSQL) --to create the #ItemsToQuery table
SELECT * FROM Items WHERE Items.ItemId IN (SELECT ItemId FROM #ItemsToQuery)
SELECT * FROM Orders WHERE Orders.OrderId IN (SELECT DISTINCT OrderId FROM #ItemsToQuery)
El problema con este enfoque es que la tabla #ItemsToQuery, ya que era creado por SQL dinámico, es inaccesible desde los siguientes 2 SQL estáticos y si cambio los SQL estáticos a dinámico, no se devuelven resultados al cliente "gordo".
3 alrededor vienen a la mente, pero estoy mirada por uno mejor:
1) La primera SQL podría llevarse a cabo mediante la ejecución del SQL de forma dinámica construida desde el cliente. Los resultados podrían pasarse como una tabla a una versión modificada del procedimiento almacenado anterior. Estoy familiarizado con pasar los datos de la tabla como XML. Si hiciera esto, el proceso almacenado podría insertar los datos en una tabla temporal utilizando un SQL estático que, debido a que fue creado por SQL dinámico, podría consultarse sin problemas.(También podría investigar el paso del nuevo param Tipo de tabla en lugar de XML.) Sin embargo, me gustaría evitar pasar listas potencialmente grandes a un procedimiento almacenado.
2) Pude realizar todas las consultas del cliente.
La primera sería algo como esto:
SELECT Items.* FROM Orders, Items WHERE Order.OrderId = Items.OrderId AND (dynamic filter)
SELECT Orders.* FROM Orders, Items WHERE Order.OrderId = Items.OrderId AND (dynamic filter)
Esto todavía me da la posibilidad de reutilizar el código objeto población de clientes caras debido a los pedidos y artículos siguen siendo devuelto en dos tablas diferentes.
Tengo la sensación de que podría tener algunas opciones para usar un tipo de datos de tabla dentro de mi proceso almacenado, pero eso también es nuevo para mí y agradecería un poco de cuchara alimentándome con eso.
Si echó un vistazo hasta aquí en lo que escribí, estoy sorprendido, pero si es así, me gustaría apreciar cualquiera de sus pensamientos sobre cómo lograr esto mejor.
TLDR: http://www.urbandictionary.com/define.php?term=TLDR –