Insert Into mit Dynamsicher Spaltenbeschreibung überhaupt möglich?

IchHH

Datenbank-Guru
Beiträge
284
Hallo alle zusammen,

ich verzweifle leider zur Zeit an einer scheinbar schier unlösbaren Aufgabe.

Ich wollte mittels eines Insert Into und einer Select Abfrage neue Daten in einer bestehenden Datenbank transferieren. Leider happert es aber aber meines erachtens daran, das der Insert Into Befehlt dieses nicht zulässt. Kann das sein?

Hier mein Versuch:

DECLARE @kopf DATE,

@query VARCHAR(2000)


SET @kopf = (Select Case When DateName(dw


, GetDate()) = 'Montag' Then Convert([nvarchar](10),DateAdd(day

, -3


, GetDate()),104) Else Convert([nvarchar](10),DateAdd(day

, -1


, GetDate()),104) End

);


strName = [Kontenart]

intAlter = 'Saldo vom ' + cast(@kopf as Varchar(10))


strSQL = 'Insert into S_92620 (Kontenart, intAlter)' &


'Select

[S_92591_1].[Kontenart]

, [S_92591_1].[Saldo] as' & intAlter &'

From [dbo].[S_92591] As [S_92591_1]

Where [S_92591_1].[wBuch_Buchung_am] = Case When DateName(dw

, GetDate()) = ''Montag'' Then Convert([nvarchar](10),DateAdd(day

, -3

, GetDate()),104) Else Convert([nvarchar](10),DateAdd(day

, -1

, GetDate()),104) End

And [S_92591_1].[wBuch_jahr] = Year(GetDate())

Order by [Kontenart] ASC'

conn.Execute strSQL

Ich wäre über jede Hilfe dankbar.

Grüsse aus Hamburg
 
Werbung:
Der Code ist zumindest schonmal nicht vollständig und ist das wirklich MSSQL?

Du deklarierst am Anfang @query, befüllst dann aber die Variable(?) strSQL. Da fehlen für MSSQL die @, es fehlt hier und da ein SET und conn.Execute ist vermutlich ein EXEC oder EXECUTE. Einige Varibalen sind nichtmal deklariert. Und nach meinem SQL Server mag er kein & zum verketten von VARCHAR(), ich nehme immer +, es müsste aber auch || etc. gehen.

Das was dann als Code raus kommt kann man ruhig auch mal auf Syntax prüfen, in der Saldo-Spaltenbeschriftung fehlen nämlich mindestens ein Leerzeichen und [] oder ''.
 
Hallo Ukulele,

ich habe nun mal versucht all deine Hinweise zu berücksichtigen. Was habe ich nun aber noch falsch gemacht?

Code:
DECLARE    @kopf DATE
        @strSQL Varchar(2000)
        @strName Varchar(20)
        @intAlter Varchar (50)

SET @kopf = (Select Case When DateName(dw
,    GetDate()) = 'Montag' Then Convert([nvarchar](10),DateAdd(day
,    -3
,    GetDate()),104) Else Convert([nvarchar](10),DateAdd(day
,    -1
,    GetDate()),104) End
);

Set    @strName = 'Kontenart'
Set    @intAlter = 'Saldo vom ' + cast(@kopf as Varchar(10))

Set @strSQL = 'Insert into S_92620 (Kontenart, intAlter)' +

'Select
    [S_92591_1].[Kontenart]
,    [S_92591_1].[Saldo] as' + intAlter +'
From     [dbo].[S_92591] As [S_92591_1]
Where    [S_92591_1].[wBuch_Buchung_am] = Case When DateName(dw
,    GetDate()) = ''Montag'' Then Convert([nvarchar](10),DateAdd(day
,    -3
,    GetDate()),104) Else Convert([nvarchar](10),DateAdd(day
,    -1
,    GetDate()),104) End
And    [S_92591_1].[wBuch_jahr] = Year(GetDate())
Order by [Kontenart] ASC'
EXEC(@strSQL)

Würde mich auch über direkte Korrekturen von dir freuen.
 
Für Korrekturen der Syntax gibt es ja die Syntaxprüfung im SQL Managementstudio, die darf jeder benutzen.

DECLARE @kopf DATE,
@strSQL Varchar(2000),
@strName Varchar(20),
@intAlter Varchar (50)

SET @kopf = (Select Case When DateName(dw
, GetDate()) = 'Montag' Then Convert([nvarchar](10),DateAdd(day
, -3
, GetDate()),104) Else Convert([nvarchar](10),DateAdd(day
, -1
, GetDate()),104) End
);

Set @strName = 'Kontenart'
Set @intAlter = 'Saldo vom ' + cast(@kopf as Varchar(10))

Set @strSQL = 'Insert into S_92620 (Kontenart, intAlter)' +

'Select
[S_92591_1].[Kontenart]
, [S_92591_1].[Saldo] as [' + @intAlter +']
From [dbo].[S_92591] As [S_92591_1]
Where [S_92591_1].[wBuch_Buchung_am] = Case When DateName(dw
, GetDate()) = ''Montag'' Then Convert([nvarchar](10),DateAdd(day
, -3
, GetDate()),104) Else Convert([nvarchar](10),DateAdd(day
, -1
, GetDate()),104) End
And [S_92591_1].[wBuch_jahr] = Year(GetDate())
Order by [Kontenart] ASC'
EXEC(@strSQL)
 
Ich habe leider kein SQL Management Studio. Vielleicht wäre damit alles leichter.

Wenn ich aber den Code nutze sagt er "Ungültiger Spaltenname 'intAlter'"
 
Das MSSQL Management Studio ist kostenlos und gibts zu MSSQL dazu. Nutzt du überhaupt MSSQL? Womit schreibst du deinen Code? Jeder halbwegs brauchbare SQL Client hat eine Syntaxprüfung.

Spaltennamen können natürlich falsch sein, das ist ja erstmal kein Syntaxfehler.
 
Habe gesehen das sich noch ein @intAlter im Text befand den ich ebenfalls angepasst habe, nun sagt das System aber "Ungültiger Spaltenname 'Saldo vom 2017-05-17'", was kann ich noch machen?
 
Es steht bei den Programm was ich nutze kein Name dabei. Da ist nur ein Fenster das "SQL ausführen..." heißt und ich die Art der Datenbank festlegen kann. In diesem Fall "MS SQL Server"

Und wenn ein Fehler auftritt steht das auch nur "Es ist ein Fehler aufgetreten" und eben die Fehlermeldung die ich hier reinschrieb.

Mein Code schreibe ich ganz normal per Hand wie eine Schreibmaschine. Die Codes bastle ich mir teilweise durch Codes im Internet zusammen.

Wenn das Programm kostenlos ist dann werde ich mir das gleich mal besorgen.
 
Erlaube mir dennoch die Frage zu stellen wie ich mit der letzten Fehlermeldung umgehen muss, will wenigstens etwas heute geschafft haben :)
 
Ich weis. Das geht doch nicht weil es diese Spalte doch nicht gibt und doch neu hinzugefügt werden soll. Ich müsste also erst die vorhanden Spalten auslesen um diese dann in die

'Insert into S_92620 (Kontenart, intAlter)'

mit einzufügen, richtig? Wie geht das?
 
Also der Reihe nach.

Du baust mit Hilfe von SQL eine Zeichenkette zusammen die dann wiederrum SQL Code enthält und ausgeführt wird. In dem Abschnitt:
Code:
, [S_92591_1].[Saldo] as [' + @intAlter +']
From [dbo].[S_92591] As [S_92591_1]
steht vorne ein Teil des starren Codes und hinten ein Teil des starren Codes der SQL Abfrage die du zusammen setzt. Dazwischen muss eine Variable stehen, du arbeitest ja mit SET und nicht innerhalb einer Abfrage die irgendwelche Spalten kennt. Daher auch das @ vor intAlter, sonst sucht er womöglich hier die Spalte intAlter.

Du musst der Variable @intAlter den Spaltennamen mit geben. Wenn der Spaltennamen Leerzeichen oder Sonderzeichen enthält muss der in eckigen Klammern stehen, sonst versucht dein zusammengebauter Select das als Code zu interpretieren und nicht als Zeichenkette.
Code:
SELECT spalte AS tolle Spalte
kann SQL nicht umsetzen, die Spalte wird nur "tolle" genannt und dann erwartet er Code. Den findet er nicht und das ergibt dann einen Syntaxfehler. Funktionieren würde:
Code:
SELECT spalte AS [tolle Spalte]
daher hatte ich auch schon die eckigen Klammern in deinen statischen Code eingebaut, damit die Variable auch Leerschritte enthalten kann.
 
Das habe ich denke ich soweit verstanden. Ich habe aus diesem Grund nun noch zwei Zeilen hinzugefügt.

1. @spalten Varchar (2000)
2. Set @spalte = 'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'S_92620'

Soweit so gut. Nun müsste ich aber das Wort "Kontenart" im SET @strSQL durch das Wort ['+@spalte+'] ersetzen, richtig?

Zusammengesetzt sieht es also wie folgt aus:
Code:
DECLARE @kopf DATE,
@strSQL Varchar(2000),
@strName Varchar(20),
@intAlter Varchar (50),
@spalten Varchar (2000)

SET @kopf = (Select Case When DateName(dw
, GetDate()) = 'Montag' Then Convert([nvarchar](10),DateAdd(day
, -3
, GetDate()),104) Else Convert([nvarchar](10),DateAdd(day
, -1
, GetDate()),104) End
);

Set @strName = 'Kontenart'
Set @intAlter = 'Saldo vom ' + cast(@kopf as Varchar(10))
Set @spalte = 'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = S_92620'

Set @strSQL = 'Insert into S_92620 (['+@spalte+'], [' + @intAlter +'])' +
'Select
[S_92591_1].[Kontenart]
, [S_92591_1].[Saldo] as [' + @intAlter +']
From [dbo].[S_92591] As [S_92591_1]
Where [S_92591_1].[wBuch_Buchung_am] = Case When DateName(dw
, GetDate()) = ''Montag'' Then Convert([nvarchar](10),DateAdd(day
, -3
, GetDate()),104) Else Convert([nvarchar](10),DateAdd(day
, -1
, GetDate()),104) End
And [S_92591_1].[wBuch_jahr] = Year(GetDate())
Order by [Kontenart] ASC'
EXEC(@strSQL)

Das Problem ist jedoch, dass doch noch die Kommas in der Aufzählung von @spalte fehlen. Wie bekomme ich das hin?
 
Haben eine Lösung gefunden um die Spalten auszulesen und automatisch anzugeben, leider funktioniert dieser nicht. Was habe ich falsch gemacht?

Code:
DECLARE @kopf DATE,
@strSQL Varchar(2000),
@strName Varchar(20),
@intAlter Varchar (50),
@Liste Varchar(4000),
@Auslesen Varchar(2000)

Set @Liste = ''
Set @kopf = (Select Case When DateName(dw
, GetDate()) = 'Montag' Then Convert([nvarchar](10),DateAdd(day
, -3
, GetDate()),104) Else Convert([nvarchar](10),DateAdd(day
, -1
, GetDate()),104) End
);

Set @strName = 'Kontenart'
Set @intAlter = 'Saldo vom ' + cast(@kopf as Varchar(10))
Set @Auslesen = (Select @Liste = @Liste + COLUMN_NAME + ',' FROM (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'S_92620') V)

Set @strSQL = 'Insert into S_92620 (['+@Auslesen+'][' + @intAlter +'])' +
'Select
[S_92591_1].[Kontenart]
, [S_92591_1].[Saldo] as [' + @intAlter +']
From [dbo].[S_92591] As [S_92591_1]
Where [S_92591_1].[wBuch_Buchung_am] = Case When DateName(dw
, GetDate()) = ''Montag'' Then Convert([nvarchar](10),DateAdd(day
, -3
, GetDate()),104) Else Convert([nvarchar](10),DateAdd(day
, -1
, GetDate()),104) End
And [S_92591_1].[wBuch_jahr] = Year(GetDate())
Order by [Kontenart] ASC'
EXEC(@strSQL)
 
Werbung:
Meldung 102, Ebene 15, Status 1, Zeile 19
Falsche Syntax in der Nähe von '='.
Code:
Set @Auslesen = (Select @Liste = @Liste + COLUMN_NAME +
Das ist irgendwie ohne Sinn und Verstand, wie wäre es mit einem schlichten:
Code:
SET @Auslesen = ( SELECT @Liste + COLUMN_NAME +
Meldung 102, Ebene 15, Status 1, Zeile 19
Falsche Syntax in der Nähe von 'V'.
Das V ist scheinbar ein Alias aus einem der Code Schnipsel der in einem SET nichts verloren hat.

Du musst dir echt einen vernünftigen Editor holen, ich werde jetzt nicht bei jeder deiner Code-Änderungen drei Syntaxfehler raus fischen.
 
Zurück
Oben