dohstemann
Goto Top

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.

Content-Key: 504676

Url: https://administrator.de/contentid/504676

Printed on: July 24, 2024 at 14:07 o'clock

Mitglied: 141320
141320 Oct 14, 2019 updated at 13:47:05 (UTC)
Goto Top
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).
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)
Member: DOHstemann
DOHstemann Oct 14, 2019 at 14:07:07 (UTC)
Goto Top
Hallo nc6400,

vielen Dank für deine Antwort.

Leider kann ich die Abfrage auch nicht ändern. Diese wird von dem Programm durchgeführt. Das heißt ich kann dort nicht manuell eingreifen.
Auch in der Datenbank kann ich nichts machen.
Genau das ist mein Problem. Ich vermute, dass mir irgendein ODBC Parameter fehlt. Oder eine Einstellung im Linux angepasst werden muss.
Mitglied: 141320
141320 Oct 14, 2019 updated at 14:13:19 (UTC)
Goto Top
Na dann musst du nur nach ODBC ignore warnings googeln face-wink.
Member: DOHstemann
DOHstemann Oct 14, 2019 at 14:26:10 (UTC)
Goto Top
Tja wäre schön, wenn es so einfach wäre.

Leider ist aber auch ein Fehler im LOG.
SQL ERROR: Fetch Error failed

Das heißt das Programm nicht das was es machen soll.
Mitglied: 141320
141320 Oct 14, 2019 at 14:30:27 (UTC)
Goto Top
Dann muss das Programm unter Linux eben angepasst werden.
Member: DOHstemann
DOHstemann Oct 17, 2019 at 07:56:15 (UTC)
Goto Top
Hallo nc6400,

tja, wenn du den Hersteller kennen würdest, dann würdest du das nicht so leichtfertig schreiben, mit dem Programm ändern. face-wink
Mitglied: 141320
141320 Oct 17, 2019 updated at 09:17:25 (UTC)
Goto Top
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. face-wink
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 ­čśü.
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.