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.

Était-ce utile?

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é

Voir SQLCMD dans MSDN

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top