2009-10-16 6 views
4

Nous écrivons parfois des scripts de dataport qui renomment des tables ou des colonnes et qui ont d'autres logiques complexes. Nous avons aussi des instructions SQL dans IF qui référencent ces anciennes colonnes ou tables. Nous avons un standard pour utiliser les instructions IF pour rendre nos scripts SQL multi-fonctionnels.Désactiver la vérification de syntaxe SQLCMD

Cependant de temps en temps, même si l'instruction if évalue à false, le code enveloppé dans le bloc est erroné, je devine en raison 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 étrange est qu'il n'est pas toujours cohérent, parfois cela fonctionne très bien.

Est-ce que quelqu'un sait si une façon que je peux désactiver ce genre de vérifications sur une base de script par script.

Merci

NOTE

Je sais que les gens vont dire qu'ils ont essayé une situation similaire et il n'a pas l'erreur. D'abord pour moi, il n'a pas d'erreur dans SSMS mais il a erré 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 avoir réexécuté plusieurs fois, il a commencé à faire erreur dans les deux cas.

+0

Je ne pense pas que cela peut être fait, mais je vais regarder les réponses que vous obtenez. –

Répondre

1

Je pense que la procédure stockée execute_sql intégrée peut contourner ce problème.

+0

Oui, le code dynamique supporterait cela. –

0

Exécutez 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 génère aucune erreur lors de la compilation ou de l'exécution.

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 réellement remplies et que le code est en cours d'exécution.


Edt

je suis allé plus loin que ce que je tapais:

La procédure stockée est créée et fonctionne pour chacun des suivants

SELECT * FROM XXXXX.XXXXX /* owner XXXXX */ 
SELECT * FROM XXXXX.XXXXX.XXXXX /* database XXXXX */ 

Les bombes de code sur lorsque je qualifie complètement le nom

SELECT * FROM XXXXX.XXXXX.XXXXX.XXXXX /* linked server XXXXX */ 

Maintenant, il LOOKS pour le serveur lié et ne trouve pas un 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'. 
0

Un instrument contondant, mais vous pouvez ignorer les erreurs.

:On Error ignore dans le script?-b et -V pour ignorer la «gravité < V» (non essayé). Peut être utile pour détecter les erreurs "aucun objet" mais lancez votre propre erreur au-dessus de V quand il y a vraiment une erreur.

See SQLCMD in MSDN

2

Essayez d'utiliser des blocs-CAPTURE, TRY facile à utiliser et élégant.

si 1 = 0

BEGIN TRY select * from mydatabase.dbo.mytable;
FIN ESSAYEZ
BEGIN CATCH
--error code de gestion
SELECT ERROR_MESSAGE()
END CATCH

Questions connexes