Come posso ottenere SSMS per utilizzare il percorso relativo dello script corrente con: r in modalità sqlcmd come fa SSDT?


11

Se ho foo.sql e bar.sql nella stessa cartella, foo.sql può fare riferimento a bar.sql quando eseguito da SSDT in modalità sqlcmd con :r ".\bar.sql". Tuttavia, SSMS non lo troverà. Procmon mostra che SSMS sta cercando %systemroot%\syswow64:

Schermata Procmon annotata

Come posso dire a SSMS di cercare nella cartella in cui viene salvato lo script corrente senza dichiarare esplicitamente il percorso?

Risposte:


8

Ottenere un percorso relativo in SSMS non è così semplice poiché non si esegue lo script; SSMS ha caricato lo script in memoria e sta eseguendo il suo testo. Quindi la directory / cartella corrente è la cartella di avvio del processo predefinito. È possibile visualizzare ciò eseguendo quanto segue in modalità SQLCMD in SSMS:

!! PWD

Tuttavia, ho trovato un modo un po 'per farlo. Ammetto che questo non è il modo super-ideale per farlo, tuttavia, attualmente sembra essere l'unico modo per ottenere un vero percorso relativo (dato che l'impostazione del percorso in una variabile non è in realtà "relativa" in sé ).

Quindi quello che puoi fare è:

  1. Eseguire un comando DOS per trovare foo.sql e archiviare il percorso di quel file in un file di testo in una cartella che è possibile ottenere da SSMS, sia perché è un percorso codificato o perché utilizza una variabile di ambiente disponibile per sia il comando DOS che la modalità SQLCMD in SSMS
  2. Quando si memorizza il percorso in quel file, archiviarlo come comando in modalità SQLCMD che imposta una variabile su quel percorso
  3. Importa quel file di testo in SSMS usando :re imposterà quella variabile sul percorso desiderato
!! CD C:\ & FOR /F %B IN ('DIR /B /A -HS /S foo.sql') DO ECHO :setvar mypath "%~dpB" > %TEMP%\relative_path.txt

:r $(TEMP)\relative_path.txt

:r $(mypath)\bar.sql

Appunti:

  • Il metodo sopra presuppone che solo 1 file sul sistema sia denominato foo.sql . Se più di un file ha quel nome, l'ultimo trovato sarà il percorso impostato nel file relative_path.txt

  • Fare CD C:\ciò inizierà dalla radice dell'unità C : . Questo non è probabilmente il punto di partenza più efficiente. Se in genere hai i tuoi file SQL in un'area come C: \ Users {YourLogin} \ Documents \ Visual Studio 2013 \ Projects , modifica il CDcomando per avvicinarti alla destinazione, ad esempio:

    !! CD C:\Users\{YourLogin}\Documents\Visual Studio 2013 & FOR ...

È creativo, ma lento e intenso su disco.
Justin Dearing il

2
@JustinDearing Come ho detto nella mia risposta, è a) non ideale e b) lento se si parte da una directory radice, ma c) l'unico modo in cui riesco a vederlo è tecnicamente relativo. Non sono sicuro che l'indicizzazione del disco rigido eliminerebbe il problema delle prestazioni.
Solomon Rutzky,

Anche se questo mi rende triste, questa è sicuramente la risposta migliore che non comporta l'impostazione del percorso da un altro script di comando o la codifica hard nel file.
QueueHammer,


2

Consiglio di salvare il file delle variabili sqlcmd in "C: \ Users \ nome_log_log \ AppData \ Local \ Temp" e di fare riferimento a tutti i miei progetti come $ (TEMP) \ sqlcmd_variables.sql.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.