2009-04-10 13 views
0

Dies ist für MS SQL 2005: Wer weiß, warum die erste erfolgreich ist, dann zwei der gleichen Anweisung in Folge nacheinander scheitert? Alle Aussagen sind genau gleich. Wenn Sie das doppelte Anführungszeichen in zwei einfache Anführungszeichen ändern, hat dies den gleichen Effekt.sp_MSforeachdb MS SQL-Fehler

sp _ MSforeachdb @ command1 = ‚if (links (2) = "p _" "?") Beginnen; drucken "?"; Ende;';

produziert

p _ NationalBrands
p _ NonBrand
p _ Database _ Namen _ Das _ Beginnt _ Mit _ P _ Underbar

aber

sp _ MSforeachdb @ command1 = 'if (links ("?", 2) = "p _") begin; drucken "?"; Ende;';
sp _ MSforeachdb @ command1 = 'if (links ("?", 2) = "p _") begin; drucken "?"; Ende;';

produziert

Msg 102, Ebene 15, Status 1, Zeile 2 falsche nahe Syntax 'sp_MSforeachdb'.

Antwort

1

Mehrere gespeicherte Prozedur Anrufe in dem gleichen Charge jeder brauchen EXEC (UTE)

EXEC sp_MSforeachdb @command1 = 'if (left(''?'', 2) = ''p_'') begin; print ''?''; end;'; 
EXEC sp_MSforeachdb @command1 = 'if (left(''?'', 2) = ''p_'') begin; print ''?''; end;'; 

ich immer 2 x Apostroph nicht doppelte Anführungszeichen Probleme zu vermeiden mit der QUOTED_IDENTIFERS Umgebungseinstellung verwenden würde.

+0

Eigentlich nur Anrufe nach dem ersten brauchen die Exec. (Persönlich würde ich es beide als eine Frage des Stils, aber es ist nicht erforderlich) – cmsjr

1

Sie müssen explizit Exec verwenden, wenn Sie mehrere Procs auf diese Weise fordern, versuchen

sp_MSforeachdb @command1 = 'if (left("?", 2) = "p_") begin; print "?"; end;'; 
exec sp_MSforeachdb @command1 ='if(left("?", 2) = "p_") begin; print "?"; end;'; 

aus der Dokumentation für Execute

mit Stored Procedures Mit EXECUTE

Sie müssen das Schlüsselwort EXECUTE nicht angeben, wenn Sie die gespeicherteausführenProzeduren, wenn die Anweisung die erste in einem Batch ist.