2010-10-29 4 views
32

Ich schrieb heute eine Abfrage für eine Tabelle in einer SQL Server 2000-Box, und während ich die Abfrage in Query Analyzer schrieb, bemerkte ich zu meiner Überraschung, dass das Wort LineNo in blauen Text konvertiert wurde.Was genau macht das reservierte Wort "LineNo" von T-SQL?

Es scheint ein reserved word nach MSDN-Dokumentation zu sein, aber ich kann keine Informationen über sie, nur Spekulation finden, dass es vielleicht ein Vermächtnis reserviertes Wort sein, das nichts zu tun hat.

Ich habe kein Problem den Feldnamen zu entkommen, aber ich bin neugierig - weiß jemand, was "LineNo" in T-SQL tatsächlich verwendet wird?

Antwort

63

OK, das ist völlig undokumentiert, und ich musste es über Versuch und Irrtum herausfinden, aber es legt die Zeilennummer für Fehlerberichte fest. Zum Beispiel:

LINENO 25 

SELECT * FROM NON_EXISTENT_TABLE 

Die oben geben Sie eine Fehlermeldung, einen Fehler in Zeile 27 (anstelle von 3 anzeigt, wenn Sie die LINENO Linie auf einer einzigen Zeile Kommentar (zB umwandeln, indem sie sie mit zwei Bindestrichen prefixing)):

Msg 208, Level 16, State 1, Line 27 
Invalid object name 'NON_EXISTENT_TABLE'. 

Dies ist in Programmiersprachen, wie die #line Präprozessordirektiven in Visual C++ und Visual C# (die dokumentiert sind, übrigens auf ähnliche Mechanismen im Zusammenhang).

Wie ist das nützlich, können Sie fragen? Nun, eine Verwendung von diesem, um SQL-Code-Generatoren zu helfen, die Code von einer höheren (als SQL-) Sprache erzeugen und/oder Makroexpansion durchführen, binden generierte Codezeilen an Benutzercodeleitungen.

P. S., Es ist keine gute Idee, sich auf undokumentierte Funktionen zu verlassen, besonders im Umgang mit einer Datenbank.

Update: Diese Erläuterung ist bis einschließlich der aktuellen Version von SQL Server, die zum Zeitpunkt der Erstellung dieses Dokuments ist SQL Server 2008 R2 kumulatives Update 5 (10.50.1753.0).

+7

Das ist fantastisch - ich würde Ihnen zwei weitere upvotes für eine "nette Antwort" geben, wenn ich könnte. Ich möchte ** darauf hinweisen, dass es nicht in Query Analyzer selbst funktioniert, sondern genauso funktioniert wie in einer Stored Procedure beschrieben. Wir müssen diese Funktion nur für gute, und nicht zum Schrauben mit DBAs verwenden ... – LittleBobbyTables

+8

Nein, lass uns mit DBA's schrauben :-) Msg 208, Ebene 16, Status 1, Zeile 2792874 –

+3

Funktioniert noch in SQL 2012 :-) – Bridge