Fehler bei einer Abfrage von einem Linux Server auf einen MS SQL Server per ODBC
Hallo zusammen,
Systeme:
SuSE Enterprise 12
unixODBC
MS originaler ODBC Treiber ( ODBC Driver Name: libmsodbcsql-17.4.so.1.1
ODBC Driver Version: 17.04.0001 )
Windows Server Cluster
MS SQL 13 ( 2016 )
ich habe das Problem, dass ich eine Verbindung zu einem, auf einem Windows Cluster, installierten MSSQL Server aufbaue.
Die eigentliche odbc Verbindung funktioniert über isql ohne Probleme. Auch Abfragen funktioniert im isql ohne Probleme.
Wenn aber die Abfrage über ein Programm ausführt wird, dann läuft dieses in einen Fehler:
ioodbc Version 1.140
Connection Time: 0.020
DBMS: Microsoft SQL Server 13.00.5426
ODBC Version: 03.52
ODBC Driver Name: libmsodbcsql-17.4.so.1.1
ODBC Driver Version: 17.04.0001
Statement: SELECT MAN,AK,GRP_NAME,PC_NAME,PRM_AB,PRM_BEZ,PRM_BIS,PRM_WERT,PC_REG FROM L2001.PARMTAB ORDER BY GRP_NAME, MAN, AK, PC_NAME
SQLCODE: 0 SQLSTATE: 01004
Message: [Microsoft][ODBC Driver 17 for SQL Server]String data, right truncation
Rowsread: 1(300) Status Array: 5|
Fetch error because of row status: 5
SQL ERROR: Fetch Error failed
Statement: SELECT MAN,AK,GRP_NAME,PC_NAME,PRM_AB,PRM_BEZ,PRM_BIS,PRM_WERT,PC_REG FROM L2001.PARMTAB ORDER BY GRP_NAME, MAN, AK, PC_NAME
SQLCODE: 0 SQLSTATE: 01004
Message: [Microsoft][ODBC Driver 17 for SQL Server]String data, right truncation
WARNING: Truncation occurred reading '2007-01-01' into Parameter.Prm_ab ( DDC_date(10) ). Length of source data is 23.
Source column: PRM_AB DATETIME
Im Endeffekt bedeutet der Fehler, dass am Ende des Feldes was abgeschnitten wird, weil das Feld zu Groß ist bzw anders definiert wird. An der Datenbank kann ich nichts ändern und
von einem anderen Windows Server ( alter Server ) gibt es auch keine Fehler. Heißt die Datenbank ist korrekt.
Ich vermute, dass bei der ODBC.ini, noch ein Parameter gesetzt werden muss. Ich weiß leider nur nicht welcher. Hier mal die odbc.ini:
[ODBC]
Description=ODBC
Driver=SQLServer
Server=tcp:IP,1433
Database=DATABASE
Language=us_english
Vielleicht hat einer von euch eine Idee.
Schonmal vielen Dank.
Systeme:
SuSE Enterprise 12
unixODBC
MS originaler ODBC Treiber ( ODBC Driver Name: libmsodbcsql-17.4.so.1.1
ODBC Driver Version: 17.04.0001 )
Windows Server Cluster
MS SQL 13 ( 2016 )
ich habe das Problem, dass ich eine Verbindung zu einem, auf einem Windows Cluster, installierten MSSQL Server aufbaue.
Die eigentliche odbc Verbindung funktioniert über isql ohne Probleme. Auch Abfragen funktioniert im isql ohne Probleme.
Wenn aber die Abfrage über ein Programm ausführt wird, dann läuft dieses in einen Fehler:
ioodbc Version 1.140
Connection Time: 0.020
DBMS: Microsoft SQL Server 13.00.5426
ODBC Version: 03.52
ODBC Driver Name: libmsodbcsql-17.4.so.1.1
ODBC Driver Version: 17.04.0001
Statement: SELECT MAN,AK,GRP_NAME,PC_NAME,PRM_AB,PRM_BEZ,PRM_BIS,PRM_WERT,PC_REG FROM L2001.PARMTAB ORDER BY GRP_NAME, MAN, AK, PC_NAME
SQLCODE: 0 SQLSTATE: 01004
Message: [Microsoft][ODBC Driver 17 for SQL Server]String data, right truncation
Rowsread: 1(300) Status Array: 5|
Fetch error because of row status: 5
SQL ERROR: Fetch Error failed
Statement: SELECT MAN,AK,GRP_NAME,PC_NAME,PRM_AB,PRM_BEZ,PRM_BIS,PRM_WERT,PC_REG FROM L2001.PARMTAB ORDER BY GRP_NAME, MAN, AK, PC_NAME
SQLCODE: 0 SQLSTATE: 01004
Message: [Microsoft][ODBC Driver 17 for SQL Server]String data, right truncation
WARNING: Truncation occurred reading '2007-01-01' into Parameter.Prm_ab ( DDC_date(10) ). Length of source data is 23.
Source column: PRM_AB DATETIME
Im Endeffekt bedeutet der Fehler, dass am Ende des Feldes was abgeschnitten wird, weil das Feld zu Groß ist bzw anders definiert wird. An der Datenbank kann ich nichts ändern und
von einem anderen Windows Server ( alter Server ) gibt es auch keine Fehler. Heißt die Datenbank ist korrekt.
Ich vermute, dass bei der ODBC.ini, noch ein Parameter gesetzt werden muss. Ich weiß leider nur nicht welcher. Hier mal die odbc.ini:
[ODBC]
Description=ODBC
Driver=SQLServer
Server=tcp:IP,1433
Database=DATABASE
Language=us_english
Vielleicht hat einer von euch eine Idee.
Schonmal vielen Dank.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 504676
Url: https://administrator.de/contentid/504676
Ausgedruckt am: 24.11.2024 um 18:11 Uhr
7 Kommentare
Neuester Kommentar
Message: [Microsoft][ODBC Driver 17 for SQL Server]String data, right truncation
WARNING: Truncation occurred reading '2007-01-01' into Parameter.Prm_ab ( DDC_date(10) ). Length of source data is 23.
Naja erst mal ist das ja nur eine Warnung, das bedeutet das von der SQL Datenbank ein DateTime-String aus der Spalte zurückgeliefert wird also Datum plus Uhrzeit ergibt mit Sekunden etc in Summe 23 Zeichen, aber dein Programm hier wohl nur ein reines Datum erwartet (10 Zeichen).WARNING: Truncation occurred reading '2007-01-01' into Parameter.Prm_ab ( DDC_date(10) ). Length of source data is 23.
Siehe:
into Parameter.Prm_ab ( DDC_date(10)
Also ändere deine Select Abfrage so ab das die Spalte nur als Datum zurückgegeben wird. Dann wird auch die Warnung verschwinden:https://www.mssqltips.com/sqlservertip/1145/date-and-time-conversions-us ...
convert(varchar, PRM_AB, 23)
Na dann musst du nur nach ODBC ignore warnings googeln .
Dann muss das Programm unter Linux eben angepasst werden.
Zitat von @DOHstemann:
Hallo nc6400,
tja, wenn du den Hersteller kennen würdest, dann würdest du das nicht so leichtfertig schreiben, mit dem Programm ändern.
Naja wenn schon mal so grundlegende Dinge wie Datenbankdefinitionen wie Typen der Spalten nicht deutlich genug definiert sind was soll man da noch sagen. Wenn du nicht in der Lage bist das zu ändern, dann geh zu jemanden der es kann, ganz einfach 😁.Hallo nc6400,
tja, wenn du den Hersteller kennen würdest, dann würdest du das nicht so leichtfertig schreiben, mit dem Programm ändern.
Und wenn das Feld sowieso nur Datumwerte statt Zeitangaben benötigt dann mach ich halt ein Update auf die Spalte der DB und fertig.
Zumindest sollte man dem Hersteller bescheid geben daß er da im Linux Programm im Bezug auf seine Datenbank Bockmist gebaut hat, oder eben ihr die DB nicht nach Vorschrift angelegt habt, keine A.
Eine ODBC Einstellung ist es zu 99,9 % nicht.
Na denn viel Erfolg 😁.
Ciao.