Ich steige durch Syntax Fehler nicht durch

IchHH

Datenbank-Guru
Beiträge
284
Hallo,

ich habe mal wieder einen Syntaxfehler und ich bin mir sicher das ich das schon gefühlt 1000 mal erklärt bekommen haben, aber warum meckert SQL hier bei '&' rum?

Code:
Declare @datum date,
@query varchar(8000)

Set @datum = DateAdd(day,-1,GetDate())
Set @query =
'Select [Kontenart], sum (Cast([Saldo] as numeric(20,2))) as ''Saldo vom '' & [' + convert(VARCHAR(10),@Datum,104) + ']
into exposttmp
from [dbo].[S_92591]
Where wBuch_Buchung_am between DATEFROMPARTS(YEAR(CURRENT_TIMESTAMP), 1, 1) and [' + convert(VARCHAR(10),@Datum,104) + ']
Group by Kontenart
Order by Kontenart'
EXEC(@query)
 
Werbung:
Du versuchst das hier auszuführen:
Code:
Select [Kontenart], sum (Cast([Saldo] as numeric(20,2))) as 'Saldo vom ' & [31.05.2017]
into exposttmp
from [dbo].[S_92591]
Where wBuch_Buchung_am between DATEFROMPARTS(YEAR(CURRENT_TIMESTAMP), 1, 1) and [31.05.2017]
Group by Kontenart
Order by Kontenart
1) & ist MySQL. Bei MSSQL geht & nicht mit Varchar was man sofort merkt wenn man mal
Code:
SELECT 'a' & 'b'
ausführt. Mit + kann man unter MSSQL hervoragend Zeichen verketten.
2) CURRENT_TIMESTAMP ist vermutlich auch aus MySQL-Code kopiert, versuche es mit getdate(). Auch MSSQL kennt Timestamps aber die haben nicht viel mit Zeit zu tun.
3) Du hast das mit den Hochstrichen und den eckigen Klammern noch nicht raus. Das Datum im Where-Teil gehört in Hochstriche, das ist ja ein Wert kein Spaltenname oder Tabellenname. Hinter einem AS kann zu allem Überfluss sowohl Hochstrich als auch eckige Klammer kommen um einen Spaltennamen zu vergeben (ich würe immer eckige Klammern nehmen).
Begrenzte Bezeichner (Datenbankmodul)
4) Du kannst hinter dem AS nur noch den Spaltennamen definieren aber keine Zeichen zu einem Spaltennamen verketten. Du kannst ja auch nicht
Code:
SELECT * FR + OM tab + elle
ausführen.

Dein Code sollte etwa so aussehen:
Code:
Select [Kontenart], sum (Cast([Saldo] as numeric(20,2))) as [Saldo vom 31.05.2017]
into exposttmp
from [dbo].[S_92591]
Where wBuch_Buchung_am between DATEFROMPARTS(YEAR(getdate()), 1, 1) and '31.05.2017'
Group by Kontenart
Order by Kontenart
 
Genau diese starre Art im AS wollte ich eben nicht haben. Kann ich den als AS ein @Spalte nehmen und diese vorher mittels
Set @spalte = ''Saldo vom '' + ['+convert(VARCHAR(10),@Datum,104)+'] nutzen?
CURRENT_TIMESTAMP ist im übrigen wirklich MSSQL und läuft bei mir hervorragend. Es kommt bei mir dann nämlich der "01.01.2017" heraus.

Das mit dem Hochkomma in @Datum habe ich nicht verstanden. Würde ich das Datum in Hochkomma setzen würde ich den Fehler mit dem "Add" bekommen, weshalb ich doch die Konvertierung vornehmen muss. Die Konvertierung ist jedoch zusammen mit dem Datum mit dem Hochkomma versehen!
 
Werbung:
Nein eine Variable geht nicht hinter AS, geht ja auch nicht als Spaltenname. Es geht nur mit dynamischem SQL. Da du das schon machst musst du es einfach nur im ersten Schritt zusammen bauen.
Code:
Declare @datum date,
@query varchar(8000)

Set @datum = DateAdd(day,-1,GetDate())
Set @query =
'Select [Kontenart], sum (Cast([Saldo] as numeric(20,2))) as [Saldo vom ' + convert(VARCHAR(10),@Datum,104) + ']
into exposttmp
from [dbo].[S_92591]
Where wBuch_Buchung_am between DATEFROMPARTS(YEAR(CURRENT_TIMESTAMP), 1, 1) and ''' + convert(VARCHAR(10),@Datum,104) + '''
Group by Kontenart
Order by Kontenart'
EXEC(@query)
 
Zurück
Oben