2017-04-05 2 views
1

Dies ist keine Fehlermeldung über Trunkierung. Stattdessen scheint die Fehlermeldung selbst (von SSMS) abgeschnitten zu sein. Irgendeine Idee, was es mir hier sagen wollte? Gibt es eine Möglichkeit, die vollständige Fehlermeldung wiederherzustellen?SQL Server-Fehlermeldung abgeschnitten

Msg 203, Level 16, State 2, Line 80 
The name 'SELECT 
SUM(CASE WHEN #actual_types.typ = 'AA' THEN #actual_types.qty ELSE 0 END) AS 'AA_Qty', 
SUM(CASE WHEN #actual_types.typ = 'AB' THEN #actual_types.qty ELSE 0 END) AS 'AB_Qty', 
SUM(CASE WHEN #actual_types.typ = 'AC' THEN #actual_types.qty ELSE 0 END) AS 'AC_Qty', 
SUM(CASE WHEN #actual_types.typ = 'BA' THEN #actual_types.qty ELSE 0 END) AS 'BA_Qty', 
SUM(CASE WHEN #actual_types.typ... 

Ich benutze SSMS 2016, verbunden mit einem SQL 2000 Server. Für den Kontext - Ich versuchte, eine generische Version eines meiner aktuellen Skripte zu erstellen (funktioniert gut gegen Produktionsdaten), mit temporären Tabellen und Beispieldaten, um als Referenz zu speichern, falls ich etwas Ähnliches in der Zukunft brauchen sollte.

Dies war der Code für den Fehler verantwortlich:

CREATE TABLE #possible_types 
    (typ varchar(2)) 

CREATE TABLE #actual_types 
    (typ varchar(2), 
    dt  smalldatetime, 
    qty int) 

INSERT #possible_types 
SELECT  'AA' 
UNION SELECT 'AB' 
UNION SELECT 'AC' 
UNION SELECT 'BA' 
UNION SELECT 'BB' 
UNION SELECT 'BC' 

INSERT #actual_types 
SELECT  'AA', '2015-01-01', 123 
UNION SELECT 'AA', '2016-01-01', 321 
UNION SELECT 'AA', '2017-01-01', 222 
UNION SELECT 'BA', '2016-01-01', 777 
UNION SELECT 'BC', '2017-01-01', 456 

DECLARE @qry varchar(8000) 
SELECT @qry = 'SELECT' + CHAR(13) 
SELECT @qry = @qry + s.sql_gen 
    FROM 
    (SELECT DISTINCT 'SUM(CASE WHEN #actual_types.typ = '''+ typ + ''' THEN #actual_types.qty ELSE 0 END) AS ''' + typ + '_Qty'',' + char(13) AS [sql_gen] 
    FROM #possible_types) s 
SELECT @qry = LEFT(@qry, LEN(@qry) - 2) -- gets rid of last comma and carriage return 
SELECT @qry = @qry + ' 
         FROM #actual_types 
         WHERE #actual_types.dt >= ''2017-01-01'' 
         ' 
--PRINT @qry 
EXEC @qry; 

DROP TABLE #possible_types 
DROP TABLE #actual_types 

Antwort

3

Fehlermeldungen in SQL Server in sys.messages gespeichert sind. Sie können die Nachrichtentabelle mit den bereitgestellten Informationen abfragen.

select * from sys.messages 
where message_id = 203 
    and language_id = 1033 --1033 is English (assumed you can read English) 

Das gibt "Der Name '%. * Ls' ist kein gültiger Bezeichner."

Sie haben offensichtlich etwas anderes in Ihrem Code wonky. Können Sie Ihre Anfrage teilen und wir können wahrscheinlich die tatsächliche Ursache des Problems ermitteln.

+0

ich den ursprünglichen Code auf die Frage hinzugefügt haben. Wenn ich mit 'PRINT' anstelle von' EXEC' laufe, zeigt es genau das, was ich im Nachrichtenfenster haben möchte. Ich kann sogar dieses Ergebnis kopieren und es wieder in den Editor einfügen und es wird einfach gut ausgeführt ... – CactusCake

+1

Hinweis - sys.messages ist kein gültiges Objekt auf meinem (alten) Server. Allerdings 'Select * von master.dbo.sysmessages, wo Fehler = 203 und mslangand = 1033' funktioniert. Vielen Dank! – CactusCake

+0

Cool, dass Sie es auf Ihrem System gefunden haben. Habe vergessen, dass du 2000 verwendest. BTW, kannst du irgendwann mal upgraden? Seit fast einem Jahrzehnt steht das Jahr 2000 nicht mehr zur Verfügung. –

1

Ich hatte den gleichen Fehler. Jetzt funktioniert es für mich.

Ich entfernte die 'für den Namen der Felder _Qty. (Eigentlich ist es nicht notwendig, dass Ihre Anfrage funktioniert).

Darüber hinaus bearbeitet I:

DECLARE @qry nvarchar(4000) 

und

EXECUTE sp_executesql @qry; 

Voll Code bearbeitet:

CREATE TABLE #possible_types 
    (typ varchar(2)) 

CREATE TABLE #actual_types 
    (typ varchar(2), 
    dt  smalldatetime, 
    qty int) 

INSERT #possible_types 
SELECT  'AA' 
UNION SELECT 'AB' 
UNION SELECT 'AC' 
UNION SELECT 'BA' 
UNION SELECT 'BB' 
UNION SELECT 'BC' 

INSERT #actual_types 
SELECT  'AA', '2015-01-01', 123 
UNION SELECT 'AA', '2016-01-01', 321 
UNION SELECT 'AA', '2017-01-01', 222 
UNION SELECT 'BA', '2016-01-01', 777 
UNION SELECT 'BC', '2017-01-01', 456 

DECLARE @qry nvarchar(4000) 
SELECT @qry = 'SELECT' + CHAR(13) 
SELECT @qry = @qry + s.sql_gen 
    FROM 
    (SELECT DISTINCT 'SUM(CASE WHEN #actual_types.typ = '''+ typ + ''' THEN #actual_types.qty ELSE 0 END) AS ' + typ + '_Qty,' + char(13) AS [sql_gen] 
    FROM #possible_types) s 
SELECT @qry = LEFT(@qry, LEN(@qry) - 2) -- gets rid of last comma and carriage return 
SELECT @qry = @qry + ' 
         FROM #actual_types 
         WHERE dt >= ''2017-01-01'' 
         ' 
PRINT @qry 
EXECUTE sp_executesql @qry; 

DROP TABLE #possible_types 
DROP TABLE #actual_types 
+0

Ah, gute Detektivarbeit, danke! Interessant, dass 'EXECUTE sp_executesql @qry;' und 'EXEC @qry;' nicht dasselbe tun. Da meine spezifische Frage die Nachrichten des Servers betrifft, denke ich @Sean bekommt das Häkchen, aber definitiv ein +1 dafür. – CactusCake

+0

Ich stimme dir zu. – etsa