Sembra che i #temptables creati utilizzando SQL dinamico tramite il metodo stringa EXECUTE abbiano un ambito diverso e non possano essere referenziati da SQL "fissi" nella stessa stored procedure. Tuttavia, posso fare riferimento a una tabella temporanea creata da un'istruzione SQL dinamica in un SQL dinamico di sottosessione, ma sembra che una stored procedure non restituisca un risultato di query a un client chiamante a meno che l'SQL non venga risolto.T-SQL SQL dinamico e tabelle temporanee
Uno scenario a 2 tabelle semplice: Ho 2 tabelle. Chiamiamoli Ordini e Articoli. L'ordine ha una chiave primaria di OrderId e gli articoli hanno una chiave primaria di ItemId. Items.OrderId è la chiave esterna per identificare l'ordine genitore. Un ordine può avere da 1 a n elementi.
Desidero essere in grado di fornire un'interfaccia di tipo "query builder" molto flessibile all'utente per consentire all'utente di selezionare gli elementi che desidera vedere. I criteri di filtro possono essere basati su campi dalla tabella Articoli e/o dalla tabella Ordine genitore. Se un articolo soddisfa la condizione di filtro inclusa e condizione sull'ordine genitore, se ne esiste uno, l'articolo deve essere restituito nella query e l'ordine principale.
In genere, suppongo, la maggior parte delle persone costruisce un join tra la tabella Articolo e le tabelle Ordine genitore. Vorrei invece eseguire 2 query separate. Uno per restituire tutti gli Articoli idonei e l'altro per restituire tutti gli Ordini genitore distinti. Il motivo è due volte e si può o non si può essere d'accordo.
Il primo motivo è che ho bisogno di interrogare tutte le colonne nella tabella Ordine genitore e se avessi fatto una singola query per unire la tabella Ordini alla tabella Articoli, avrei repoeated le informazioni dell'Ordine più volte. Dal momento che in genere sono presenti un numero elevato di articoli per ordine, vorrei evitare questo perché ciò comporterebbe il trasferimento di molti più dati verso un client grasso. Invece, come accennato, vorrei restituire le due tabelle individualmente in un set di dati e utilizzare le due tabelle all'interno per popolare un ordine personalizzato e oggetti client Elementi figlio. (Non conosco ancora abbastanza su LINQ o Entity Framework. Costruisco i miei oggetti a mano). La seconda ragione per cui vorrei restituire due tabelle invece di una è perché ho già un'altra procedura che restituisce tutti gli elementi per un determinato OrderId insieme all'ordine genitore e vorrei utilizzare lo stesso approccio a due tabelle in modo che io potrebbe riutilizzare il codice client per popolare i miei oggetti Ordine e Cliente personalizzati dai 2 datatables restituiti.
quello che speravo di fare era questa:
costruire una stringa SQL dinamico sul client, che unisce la tabella ordini al tavolo Elementi e di appositi filtri su ogni tavolo, come specificato dal filtro personalizzato creato sul Winform app fat-client. La build di SQL sul client avrebbe guardato qualcosa di simile:
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 */
"
Poi, vorrei chiamare una stored procedure,
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)
Il problema di questo approccio è che tavolo #ItemsToQuery, dal momento che era creato da SQL dinamico, è inaccessibile dai seguenti 2 SQL statici e se modifico SQL statici in dinamico, nessun risultato viene passato al fat client.
3 intorno vengono in mente, ma io sono aspetto per uno migliore:
1) La prima SQL potrebbe essere eseguita eseguendo lo SQL costruito in modo dinamico dal client. I risultati potrebbero quindi essere passati come tabella a una versione modificata della procedura memorizzata sopra. Conosco i dati della tabella di passaggio come XML. Se l'ho fatto, il proc memorizzato potrebbe quindi inserire i dati in una tabella temporanea utilizzando un SQL statico che, poiché è stato creato da SQL dinamico, potrebbe quindi essere interrogato senza problemi.(Potrei anche indagare su come passare il nuovo param di tipo Table invece di XML.) Tuttavia, vorrei evitare di passare a elenchi potenzialmente grandi per una stored procedure.
2) Potrei eseguire tutte le query dal client.
Il primo sarebbe qualcosa di simile:
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)
Questo mi dà ancora con la possibilità di riutilizzare il mio cliente codice oggetto-sided popolazione perché gli Ordini ed elementi continuano ad essere restituito in due diverse tabelle.
Ho la sensazione che potrei avere alcune opzioni che utilizzano un tipo di dati Tabella all'interno del mio proc memorizzato, ma anche questo è nuovo per me e gradirei un po 'di cucchiaio che si nutre di quello.
Se hai anche scansionato fino a questo punto in quello che ho scritto, sono sorpreso, ma se così fosse, non capirò mai i tuoi pensieri su come ottenere il meglio.
TLDR: http://www.urbandictionary.com/define.php?term=TLDR –