web-dev-qa-db-fra.com

Comment obtenir le chemin relatif du fichier en mode SQLCMD dans SSMS?

J'ai le script maître ci-dessous qui crée des tables, insère des données et crée ensuite les procédures stockées.

--todo_master.sql

use master
go

:r todo_create_ddl.sql
:r todo_create_dml.sql
:r todo_create_sprocs.sql
go

Cependant, même si todo_master.sql se trouve dans le même chemin que les trois autres scripts, il est impossible de localiser ces trois scripts.

Je reçois l'erreur suivante:

A fatal scripting error occurred.
The file specified for :r command was not found.

Si je fournis le chemin complet comme ci-dessous, ces fichiers sont trouvés et exécutés comme prévu.

"C:\Docs and Settings\user\My Docs\SSMS\Projects\todo_create_ddl.sql"

Que pourrais-je manquer?


Edit Comme suggéré par Jason, j'ai essayé ceci, mais j'obtiens toujours la même erreur:

use master
go

:setvar path "C:\Documents and Settings\user\My Documents\SQL Server Management Studio\Projects"
:setvar ddl "todo_create_ddl.sql"
:setvar dml "todo_create_dml.sql"
:setvar sprocs "todo_create_sprocs.sql"

:r $(path)$(ddl)
:r $(path)$(dml)
:r $(path)$(sprocs)
go
14
Animesh

Vous pouvez contourner ce problème en utilisant l'option sqlcmd setvar pour affecter le chemin d'accès à une variable. Puis utilisez cette variable dans votre appel :r comme:

:setvar path "c:\some path"
:r $(path)\myfile.sql

Ce lien a un exemple plus détaillé: http://www.simple-talk.com/sql/sql-tools/the-sqlcmd-workbench/

Cela fait, vous pouvez supprimer la ligne setvar et la transmettre à partir de la ligne de commande avec:

Sqlcmd /Sserver /E -ddatabase -iInputfilename -oOutputfilename -v path=c:\somepath

Cela contournerait le problème du script ne fonctionnant pas à partir du répertoire à partir duquel le premier script SQL a été appelé.

25
Jason Cumberland

Je réalise que c'est assez vieux, mais j'ai remarqué une erreur dans votre code édité: vous devez inclure une barre oblique inverse entre le chemin et le nom du script.

:r $(path)\$(ddl)
:r $(path)\$(dml)
:r $(path)\$(sprocs)
5
DogLimbo

J'ai trouvé que ce serait le meilleur:

:setvar path C:\"some path"

:r $(path)\myfile.sql

Vous devez mettre des déclarations avec un espace entre guillemets, mais pas la déclaration entière. C'est pourquoi vous pouvez faire C:\"some path"

4
Bryce

Obtenir un chemin relatif dans SSMS n’est pas si simple puisque vous n’exécutez pas le script; SSMS a chargé le script en mémoire et exécute son texte. Le répertoire/dossier actuel est donc le dossier de démarrage par défaut du processus. Vous pouvez le voir en exécutant ce qui suit en mode SQLCMD dans SSMS:

!! PWD

Cependant, j'ai trouvé un moyen un peu à la sorte de le faire. J'admets que ce n'est pas la façon la plus idéale de le faire, cependant, cela semble être actuellement le seul moyen d'obtenir un chemin true relatif (étant donné que la définition du chemin dans une variable n'est pas vraiment "relatif" en soi).

Donc ce que vous pouvez faire c'est:

  1. Exécutez une commande DOS pour rechercher todo_master.sql et stockez le chemin d'accès à ce fichier dans un fichier texte situé dans un dossier accessible à partir de SSMS, soit parce qu'il s'agit d'un chemin codé en dur, soit parce qu'il utilise un fichier. variable d'environnement disponible pour la commande DOS et pour le mode SQLCMD dans SSMS
  2. Lorsque vous stockez le chemin dans ce fichier, stockez-le en tant que commande de mode SQLCMD qui définit une variable sur ce chemin.
  3. Importez ce fichier texte dans SSMS à l'aide de :r et définira cette variable sur le chemin souhaité.
!! CD C:\ & FOR /F %B IN ('DIR /B /A -HS /S todo_master.sql') DO ECHO :setvar mypath "%~dpB" > %TEMP%\relative_path.txt

:r $(TEMP)\relative_path.txt

:r $(mypath)\todo_create_ddl.sql
GO
:r $(mypath)\todo_create_dml.sql
GO
:r $(mypath)\todo_create_sprocs.sql
GO

Remarques:

  • La méthode ci-dessus suppose qu'un seul fichier sur le système s'appelle todo_master.sql. Si plusieurs fichiers portent ce nom, le dernier trouvé sera le chemin défini dans le fichier chemin_relatif

  • Faire le CD C:\ va commencer à la racine du lecteur C:. Ce n'est probablement pas l'endroit le plus efficace pour commencer. Si vos fichiers SQL se trouvent généralement dans une zone telle que C:\Utilisateurs {YourLogin}\Documents\Visual Studio 2013\Projets, modifiez simplement la commande CD pour vous rapprocher de la destination, par exemple:

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

Utilisez un fichier de commandes comme aide.

Modifiez todo_master.sql pour utiliser une variable d'environnement appelée mypath:

use master
go 
:r $(mypath)\todo_create_ddl.sql
:r $(mypath)\todo_create_dml.sql
:r $(mypath)\todo_create_sprocs.sql
go

Et dans votre fichier batch todo_master.bat

/* set the environment variable to the current directory */
SET mypath=%cd%
/* run your sql command */
sqlcmd -i todo_master.sql
0
Jared Beach

J'avais moi-même le même problème et j'espère ne pas énoncer une évidence. Pourquoi ne pas ouvrir une instance Dos/Cmd ou PowerShell, cd dans le répertoire contenant les scripts, puis charger Management Studio à partir de là?

J'ai cet alias dans ma configuration PowerShell (votre chemin peut être différent):

Set-Alias -Name 'Ssms' -Value "${env:ProgramFiles(x86)}\Microsoft SQL Server\120\Tools\Binn\ManagementStudio\Ssms.exe" 

Je puis cd dans le dossier contenant le fichier de solution, puis je fais

Ssms mysolution.ssmssln
0
Tahir Hassan