Désactiver SQLCMD Vérification de la syntaxe
-
21-09-2019 - |
Question
Nous écrivons parfois des scripts dataport que renommer des tables ou des colonnes et qui ont d'autres logiques complexes. Nous avons également SQL dans les instructions IF faisant référence ces vieilles colonnes ou tables. Nous avons une norme à utiliser les instructions IF pour rendre nos scripts SQL exécutées plusieurs convivial.
Cependant de temps en temps, même si l'instruction if false, le code enveloppé dans les erreurs de bloc, je devine à cause d'une vérification de la syntaxe.
if 1 = 0
begin
select * from mydatabase.dbo.mytable; -- doesn't execute, but still errors because doesn't exist
end
Une autre chose bizarre est il est pas toujours cohérente, parfois, il fonctionne très bien.
Quelqu'un sait-il si une façon que je peux désactiver ces sortes de contrôles sur un scénario de base de script.
Merci
NOTE
Je sais que les gens vont dire qu'ils ont essayé une situation similaire et il n'a pas l'erreur. Tout d'abord pour moi, il ne l'a pas erreur dans SSMS mais il errored dans SQLCMD.
sqlcmd MyTestScript.sql -r 1 -U user -P password
Puis-je mettre SSMS en mode SQLCMD Requête -> CMDMODE et il n'a toujours pas donné l'erreur. Puis, après réexécution quelques fois il a commencé à l'erreur dans les deux.
La solution 2
Je pense execute_sql construit dans la procédure stockée peut fonctionner autour de cela.
Autres conseils
Essayez d'utiliser des blocs-CAPTURE, TRY facile à utiliser et élégant.
si 1 = 0
BEGIN essayer et
select * from mydatabase.dbo.mytable;
FIN
TRY
BEGIN CATCH
Code de manutention --error
SELECT ERROR_MESSAGE ()
END CATCH
Exécuter le code suivant dans votre environnement de dev
DROP Procedure dbo.#TestProc
GO
CREATE Procedure dbo.#TestProc
AS
IF 1=0
BEGIN
SELECT 1 FROM XXXXX
END
ELSE
BEGIN
SELECT *
FROM Information_Schema.Tables
WHERE Table_Name = 'XXXXX'
END
GO
EXEC #TestProc
Il compile. Il exécute. Il ne l'erreur pas lors de la compilation ou l'exécution soit.
J'utilise SQL 2005.
Comme vous pouvez le voir sur les résultats, il n'y a pas de table appelé XXXXX
.
Je pense que vos conditions sont effectivement remplies et que le code est exécuté.
Edt
Je suis allé plus loin que ce que je tapais:
Le proc stocké est créé et fonctionne pour chacun des éléments suivants
SELECT * FROM XXXXX.XXXXX /* owner XXXXX */
SELECT * FROM XXXXX.XXXXX.XXXXX /* database XXXXX */
Les bombes de code quand je saisir le nom complet
SELECT * FROM XXXXX.XXXXX.XXXXX.XXXXX /* linked server XXXXX */
Maintenant, il semble pour le serveur lié et ne trouve pas une seule et renvoie une erreur.
Msg 7202, Level 11, State 2, Procedure #TestProc, Line 6
Could not find server 'XXXXX' in sys.servers.
Verify that the correct server name was specified.
If necessary, execute the stored procedure sp_addlinkedserver
to add the server to sys.servers.
Msg 2812, Level 16, State 62, Line 1
Could not find stored procedure '#TestProc'.
Un instrument contondant, mais vous pouvez ignorer les erreurs.
:On Error ignore
dans le script?
-b et -V à ignorer "la gravité