In un database SqlServer che utilizzo, il nome del database è qualcosa come StackExchange.Audio.Meta
o StackExchange.Audio
o StackOverflow
. Per pura fortuna questo è anche l'url per un sito web. Ho solo bisogno di dividerlo sui punti e invertire: meta.audio.stackexchange
. Aggiungendo http://
e .com
e ho finito. Ovviamente Stackoverflow
non ha bisogno di alcuna retromarcia.Concatena il risultato di uno String_Split ordinato in una variabile
Utilizzando 2016 string_split funzione di SqlServer posso facile scissione e riordinare il suo risultato:
select value
from string_split(db_name(),'.')
order by row_number() over(order by (select 1)) desc
Questo mi dà
| Value |
-----------------
| Meta |
| Audio |
| StackExchange |
Come ho bisogno di avere l'url in una variabile speravo di concatenare usando questo answer così il mio tentativo assomiglia a questo:
declare @revname nvarchar(150)
select @revname = coalesce(@revname +'.','') + value
from string_split(db_name(),'.')
order by row_number() over(order by (select 1)) desc
Tuttavia, questo mi restituisce solo l'ultimo valore, StackExchange
. Ho già notato gli avvertimenti su quella risposta che questo trucco funziona solo per determinati piani di esecuzione come spiegato here.
Il problema sembra essere causato dalla clausola order by
. Senza di ciò ottengo tutti i valori, ma poi nell'ordine sbagliato. Ho provato ad aggiungere la funzione ltrim
e rtrim
come suggerito nell'articolo di Microsoft, così come una sottoquery ma finora senza fortuna.
Esiste un modo per spingere il motore di query di Sql Server 2016 a concatenare il risultato ordinato da quello string_split
in una variabile?
So che posso usare for XML
o anche un semplice cursore per ottenere il risultato che mi serve ma non voglio rinunciare ancora a questa soluzione elegante.
Poiché sto eseguendo questa operazione su Stack Exchange Data Explorer, non posso utilizzare le funzioni, poiché non abbiamo il permesso di crearle. Posso fare procedure memorizzate ma speravo di poterle eludere.
Ho preparato un SEDE Query per sperimentare. I nomi dei database per aspettarsi sono o senza punti e aka StackOverflow
, con 1 punto: StackOverflow.Meta
o 2 punti, `StackExchange.Audio.Meta, l'elenco completo delle banche dati è here
Perché non http://data.stackexchange.com/meta.avp/query/506813? Oh e riguardo al tuo desiderio di usare il metodo di assegnazione variabile non c'è mai alcuna garanzia che funzionerà. http://stackoverflow.com/questions/15138593/nvarchar-concatenation-index-nvarcharmax-inexplicable-behavior/15163136#15163136 –
Mi rendo conto che sto usando un comportamento non definito, quindi lo accetto anche come risposta. – rene
Non rispondere veramente alla domanda, ma se stai generando URL con tutte queste manipolazioni di stringhe, perché non avere una tabella di ricerca? Nella tua query SEDE stai già facendo cose strane ('when 'audio' quindi' Avp') quindi non è meglio avere una tabella di traduzione per tutto questo? – DavidG