ho una stringa restituita da una query che recita:di SQL Server utilizzando variabili nella query perno
+----------------------+
| returnquerystring |
+----------------------+
| exam1,exam2,exam3 |
+----------------------+
Sto usando questo restituito stringa come nomi di colonna in una query di rotazione.
select * from (select score,exam from table1) x
pivot (max(score) for exam in (exam1,exam2,exam3)
Questa interrogazione mi funziona dando
+-------------+-----------+-----------+
| exam1 | exam2 | exam3 |
+-------------+-----------+-----------+
| 10 | 20 | 30 |
+-------------+-----------+-----------+
Tuttavia non sono stato in grado di ottenere il pivot "in" dichiarazione di usare qualsiasi cosa ma i valori hard coded di exam1, exam2, exam3. Ad esempio, ho utilizzato SSMS e ho creato una query che mette correttamente exam1, exam2, exam3 in @ var1. Tuttavia @ var1 genera ed errore se usato al posto di exam1, exam2, exam3.
declare @var1 varchar(100)
select @var1 = value from table
select * from (select score,exam from table1) x
pivot (max(score) for exam in (@var1)
Incorrect syntax near '@var1'.
Per verificare che stavo facendo correttamente ho fatto questo e ha funzionato.
declare @var1 int
select top 1 @var1 = id from name
select * from name where id = @var1
Questo ha fornito la riga di dati per id 1 sulla tabella nome senza errori.
Ho notato nei miei esperimenti che (esame 1, esame 2, esame 3) non può essere ('esame1, esame2, esame3') con le virgolette.
Sto utilizzando ColdFusion CFSCRIPT e sembra che le virgolette singole stiano entrando nella query, quindi ho provato vari test con le funzioni di ColdFusion per rimuoverli senza successo.
Così ho provato a utilizzare la funzione SQL Server 'replace' attorno a @ var1 e che genera un errore sulla sintassi al momento della sostituzione.
Questo è quando ho provato a utilizzare un esempio come sopra in SSMS e ho ancora errori. Quindi rimuovendo ColdFusion dall'equazione non funziona ancora. Il mio pensiero era quello di inviare l'intero dichiarare tramite pivot come una query per evitare problemi di ColdFusion ma non funziona in SSMS.
Sto usando SQL Server 8 e 11. SSMS
Tutte le idee su come fare questo lavoro?
examColumns = exam1,exam2,exam3
public any function qryExamScores(string examColumns) {
thisQry = new Query();
thisQry.setName("returnqry");
thisQry.setDatasource(application.datasource);
thisQry.addParam(name="columnNames",value=arguments.examColumns,cfsqltype="cf_sql_varchar");
result = thisQry.execute(sql="
select * from
(select id,score,exam
from table
where value1 = 'XXXXX'
and value2 = '11111') x
pivot
(
max(score) for exam in (:columnNames)
) p
");
returnqry = result.getResult();
return returnqry;
}
CRONACA - se avete bisogno di apici per essere passato "così come sono" da ColdFusion è necessario utilizzare la funzione di 'preservesinglequotes()' - altrimenti CF sfugge helpully apici ammesso che sono parte di una variabile di carattere per inserire o aggiornare. –
Credo che SQL dinamico sarà richiesto; tuttavia la tabella contiene solo una riga? nella tua verifica hai fatto il primo 1, ma nella tua selezione non l'hai fatto. Mi ha fatto pensare che più file potrebbero tornare indietro e il "dentro" non può gestirlo. – xQbert
Mark sembra che ColdFusion stia mettendo le virgolette singole e io non le voglio. È CFSCRIPT quindi sto passando exam1, exam2, exam3 come un param varchar come: parametervalue. Ricevo un errore che sembra che ci siano delle virgolette ma quando esco dalla stringa che entra nella funzione non ce ne sono. Se hai un modo di usare ColdFusion, sono tutto orecchie. – dutchlab