Zum Inhalt springen

Script für Datenbankabfrage in SQLServer2000


miprant

Empfohlene Beiträge

Also das Excel damit Probleme hat, kann ich mir gut vorstellen, da ja keinerlei Zeilentrenner gesetzt werde. Für Excel sieht es also dann so aus, als wenn viele Spalten nebeneinander stehen. Und bei 256 Spalten ist dann natürlich Schluss (Spalte IV). Aber Excel ist ja auch nicht deine Zielanwendung wenn ich das richtig verstanden habe...

Wie liest denn die Gegenseite die Datei ein? Sie muss ja auch irgendetwas fest machen, dass die Zeile zuende ist? (bestimmte Anzahl der Felder?)

Link zu diesem Kommentar
Auf anderen Seiten teilen

habe grad einen Lösungsansatz bekommen: man sollte bereits in der SELECT Zeile die Zeilenumbrüche (\n oder \n\r) durch "" ersetzen. Sagt dir das was?

Und wenn ja, wie sollte der in der Praxis ausschaun?

Du meinst in deinen Daten stehen schon Zeilenumbrüche drin? Hmm, lass mich mal kurz grübeln...

Link zu diesem Kommentar
Auf anderen Seiten teilen

nein, Excel ist nicht meine Zielanwendung. Die CSV-Daten sind für eine php-Schnittstelle auf unserem Webserver gedacht. Und für diese php-Schnittstelle darf pro Zeile nur ein Datensatz stehen.

Derzeit ist es aber so, dass mitten in einem Datensatz ein Zeilenumbruch steht und die php-Schnittstelle dies dann als neuen Datensatz sieht.

Die Folge ist klar: die Datensätz werden nicht importiert sondern ausgelassen.

Wie liest denn die Gegenseite die Datei ein? Sie muss ja auch irgendetwas fest machen, dass die Zeile zuende ist? (bestimmte Anzahl der Felder?) ==> RICHTIG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, dann hab ichs jetzt verstanden.

Füge mal in die Zeilen des Selects wo ein varchar ausgelesen wird folgendes ein:

REPLACE(REPLACE([I]<Spaltenname>[/I], char(10) , ' '), char(13),' ') AS [I]<gewünschter_Alias>[/I]
... also ...
REPLACE(REPLACE(T0.ItemName, char(10) , '  '), char(13),'  ') AS 'Artikelbeschreibung deu kurz'

(Hab jetzt mal angenommen, dass in der Spalte Text steht. :D bcp dann natürlich ohne "-r", da hatten wir uns dann misstverstanden ;))

Edit:

Die Replace-Funktion ersetzt einfach das Vorkommen von carriage return und linfeed durch blank. Vielleicht solltest du die Gegenseite fragen, ob du die nicht einfach maskierst indem du in den String gleich <br> o.ä. einfügst...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab deinen Vorschlag grad versucht, aber folgende Fehlermeldung kommt:

D:\sql>powergap_ohne_ftp.cmd

1> 2> 1> 2> 3> 4> 1> 2> 3> 4> 5> 6> 7> 8> 9> 10> 11> 12> 13> 14> 15> 16> 17> 18>

19> 20> 21> 22> 23> 24> 25> 26> 27> 28> 29> 30> 31> 32> 33> 34> 35> 36> 37> 38>

39> 40> 41> 42> 43> 44> 45> 46> 47> 48> 49> 50> 51> 52> Msg 8116, Level 16, Sta

te 1, Server SAP, Procedure stprGetCSVData, Line 12

Argument data type ntext is invalid for argument 1 of replace function.

Msg 8116, Level 16, State 1, Server SAP, Procedure stprGetCSVData, Line 12

Argument data type ntext is invalid for argument 1 of replace function.

Msg 8116, Level 16, State 1, Server SAP, Procedure stprGetCSVData, Line 12

Argument data type ntext is invalid for argument 1 of replace function.

1> SQLState = 37000, NativeError = 2812

Error = [Microsoft][ODBC SQL Server Driver][sql Server]Could not find stored procedure 'hutstuebele..stprGetCSVData'.

Sagt dir das was?

Zur Sicherheit hab ich hier nochmal den Auszug aus der Prozedur:

...

SELECT T0.ItemCode,

T0.ItemName AS 'Artikelbeschreibung deu kurz',

T3.FirmName AS 'Marke',

T0.SuppCatNum AS 'Lief.art.nr.',

T0.SalUnitMsr AS 'ME',

T0.VatGourpSa AS 'SteuerID',

T0.OnHand,

REPLACE(REPLACE(T0.UserText, char(10) , ' '), char(13),' ') AS 'Artikelbeschreibung deu lang',

T0.U_Descrip2 AS 'Artikelbeschreibung ital kurz',

REPLACE(REPLACE(T0.U_Detail2, char(10) , ' '), char(13),' ') AS 'Artikelbeschreibung ita lang',

T0.U_Descrip1 AS 'Aritkelbeschreibung eng kurz',

REPLACE(REPLACE(T0.U_Detail1, char(10) , ' '), char(13),' ') AS 'Artikelbeschreibung eng lang',

T0.U_webshop AS 'Aktiv',

T0.U_webVfb2 AS 'Liefertage',

T0.U_webVfb1 AS 'Sortierung',

T1.Price AS 'VK-Preis',

T0.U_EPA_spec AS 'Angebot',

T0.U_mk1bez AS 'Groesse',

T0.U_mk2bez AS 'Farbe',

T0.U_farbeI AS 'Farbe ita',

T0.U_farbeE AS 'Farbe eng',

T1.Price AS 'VK-Preis2',

T1.PriceList,

T0.U_wgrpnr AS 'Gruppe',

T0.U_EPAObjID AS 'UGR',

T0.U_EPA_supr AS 'UGR_2',

T0.U_EPA_crss AS 'Artikelzusätze',

T0.QryGroup1 AS 'Damen',

T0.QryGroup2 AS 'Herren',

T0.QryGroup3 AS 'Kinder',

T0.QryGroup4 AS 'Erwachsene',

T0.U_EPA_prod AS 'Versandkostenfrei'

FROM OITM T0

INNER JOIN ITM1 T1

ON T0.ItemCode = T1.ItemCode

INNER JOIN OMRC T3

ON T0.FirmCode = T3.FirmCode

WHERE T0.U_webshop ='Y'

AND T1.PriceList =2

...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin,

Da hast du ja ein schönes Problemchen. Anscheinend sind deine Spalten TEXT oder NTEXT, daher kann die Replace-Funktion darauf nicht direkt arbeiten. Das hat der Compiler gemerkt und die Prozedur nicht angelegt, der Rest ist Folgefehler...

Unter SQL2005 wäre die Umwandlung kein Problem, da es dort einen Datentyp namens nvarchar(max) gibt. Dieser steht dir auf deinem 2000er System leider nicht zur Verfügung. Bevor ich mir die Mühe geb und ein Script für ein Update auf eine temporäre Tabelle zu schreiben, würde es evtl auch reichen, die ersten 4000 Zeichen zu übertragen?

Gruß,

Honky

Link zu diesem Kommentar
Auf anderen Seiten teilen

...Problemchen ist gut... ;)

Was meinst du mit den ersten 4000 Zeichen? Insgesamt oder pro Feld? Weil pro Feld oder Zeile kommen nie soviele zusammen, von daher wären 4000 Zeichen mehr als ausreichend.

Wenn du die ganze Datei meinst, dann sind da weit mehr als 4000 Zeichen, da alleine bereits jetzt ca. 3200 Zeilen da sind

viele Grüße,

Michael

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein, ich meinte natürlich pro Feld. Die Gesamtgrösse der Datei ist davon unberührt...

Dann setz mal dies ein:

REPLACE(REPLACE([B]CAST(<Spaltenname> AS nvarchar(4000))[/B], char(10) , ' '), char(13),' ') AS <gewünschter_Alias>

Dies wandelt dein Result aus dem Textfeld, welches ja deutlich mehr als 4000 Zeichen enthalten kann, in den Datentyp nvarchar um. Da der nur 4000 Zeichen lang sein kann, wird der Rest einfach ohne Fehlermeldung abgeschnitten.

TEXT bzw. NTEXT sollte man in der Tat nur verwenden, wenn es wirklich nicht anders geht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann check nochmal die Anzahl der öffnenden & schließenden Klammern.

REPLACE(REPLACE(CAST(T0.UserText AS nvarchar(4000)), char(10) , ' '), char(13),' ') AS 'Artikelbeschreibung deu lang',

Nein, nvarchar gibt es schon. Allerdings nur in der größenbegrenzten Art, unter SQL 2005 kann man mit der Angabe "max" wesentlich größere Strings verwalten...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Buon giorno Honky! Oder wie man bei euch wohl sagt: Moin!

Super Sache - der Code passt. Würde sagen, das Problem ist gelöst... wenn da nicht doch noch eine kleine Sache wäre... (muss wohl immer so sein...).

Und zwar wird dieses .csv-file anscheinend nicht im Ascii Modus gespeichert, da die Schnittstelle auf der anderen Seite das file nur richtig einliest, wenn ich es vorher mit einem TextEditor geöffnet und manuell gespeichert habe... :confused:

Hast du vielleicht noch eine Idee, ob man beim bcp noch was einstellen kann dass das file automatisch wie beschrieben richtig gespeichert wird?

Danke für deine Mühe!

lg

Michael

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin ist korrekte Anrede :D

Hm, das wiederspricht sich dann irgendwie doch mit deiner UTF-8 Angabe, wenn du nun ASCII haben möchtest oder?

Ich glaube, dass das Problem schlichtweg darin liegt, dass deine Spalten, die Text enthalten unicode-varchar (nvarchar). Die müssten wir beim Export wohl auch nochmal umwandeln, damit sie korrekt in die Datei wandern. BCP sollte nämlich per se ASCII-Satz speichern...

Ersetz mal bitte in deinen Textspalten innerhalb des Selects nvarchar(4000) durch varchar(8000) (bei normalen varchar können wir auch größere Textlängen zulassen...)

Gruß,

Honky

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo!

Das mit dem ASCII hab ich von der Gegenseite (php-Schnittstellen-Programmierer). Der meinte, dass die korrekte Umwandlung erst funktioniert, wenn er die CSV-Datei mit einem Texteditor öffnet und manuell speichert.

Wenn ich das "UTF-8" weglasse, dann habe ich Probleme mit den Umlauten und Sonderzeichen. Diese Probleme habe ich aber nicht, wenn ich die CSV-Datei im Editor öffne und speichere... :confused:

Ich werd aber jetzt mal deinen Vorschlag testen, vielleicht klappts ja...

Der php-Programmierer kann mir übrigens (noch) nicht sagen, was das eigentliche Problem ist (welcher Fehler dahinter steckt...). Das macht's nicht leichter...

vG

Michael

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Vorschlag mit der Änderung von nvarchar auf varcher hat leider nicht den gewünschten Erfolg gebracht.

Die Gegenseite meint, dass wir einen php-tauglichen Zeichensatz verwenden sollen. Mit reinem ASCII gibts aber keine Umlaute... Weiters meinen die, wir müssten das "Speichern in einem Texteditor" "simulieren". Keine Ahnung, wie wir das machen sollen. Frage:

1. hast du einen Vorschlag für anderen Zeichensatz als UTF-8 (der aber auch Umlaute enthält?)

2. was hältst du von diesem "simulieren"? Hast du eine Ahnung, wie wir das machen könnten? (ich weiss ja nicht mal, wie der Texteditor es macht, dass Umlaute zwar angzeigt aber nicht als solches gespeichert werden?!)

Nachdem du hier eindeutig derjenige von uns beiden bist, der hier weiss was er tut, hoffe ich du hast eine Aw auf meine Fragen ;)

viele Grüße,

Michael

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...