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
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é.
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)
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"
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:
: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 ...
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
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