Benutzer mit den meisten Antworten
String in SP austauschen

Frage
-
Hallo allerseits,
ich finde keine Lösung für folgendes Problem. Innerhalb einer StoredProcedure (MSSQL 2005) lade ich zur weiteren Verarbeitung Daten aus einem externen txt-File
declare @Test varchar(max)
select @Test = BulkColumn
from openrowset(bulk ‘F:\Testordner\Testtext.txt’, single_blob) as x
Nun möchte ich den Pfad zum File (F:\Testordner\Testtext.txt) mittels Parameter aus einer C#-Anwendung heraus dynamisch austauschen. Hat jemand dazu einen guten Tip bzw. ein Beispiel? Das wäre toll.
Gruß Volkmar
Antworten
-
Hi,
unter welchem Benutzer läuft dein SQL Server? Kann es evtl. sein, dass der Dienstuser keinen zugriff auf die Datei hat?
Grüße
Oliver
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 5. Juni 2012 15:56
-
Auf Berechtigungen tippe ich auch.
Ich bin mir nicht sicher, aber ich meine, wenn Du per Windows Account an den SQL Server angemeldet bist und OpenRowset direkt aufrufst, kommen Deine Berechtigungen zum Tragen. Verwendet man sp_executesql wird das Dienstkonto des SQL Servers verwendet und dem könnten die Rechte fehlen.
Leg zum Testen die Daten z.B. ins DATA Verzeichnis des SQL Server, dort hat der SQL Server jedenfalls Rechte.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 5. Juni 2012 15:56
Alle Antworten
-
Hallo Volkmar,
dafür kannst du den Befehl exec(String) verwenden.
Hier ein Beispiel:
declare @Test varchar(max) declare @anweisung varchar(2000) declare @Quelle varchar(2000) set @quelle = '\‘F:\\Testordner\\Testtext.txt\’' set @anweisung = 'select @Test = BulkColumn from openrowset(bulk ' + @quelle + ', single_blob) as x' exec (@anweisung)
Grüße
Oliver
-
@Oliver, das funktioniert nicht ganz, die Variable @Test muss mit übergeben werden, dazu eignet sich sp_executesql
Hallo Volkmar,
so sollte es funktionieren:
declare @Test varchar(max) declare @anweisung nvarchar(2000) declare @Quelle varchar(2000) DECLARE @ParmDefinition nvarchar(100); SET @quelle = '''D:\test.txt''' SET @ParmDefinition = N'@Test varchar(max) OUTPUT'; SET @anweisung = N'select @Test = BulkColumn from openrowset(bulk ' + @quelle + ', single_blob) as x'; exec sp_executesql @anweisung, @ParmDefinition, @Test=@Test OUTPUT ; SELECT @Test
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Bearbeitet Olaf HelperMVP Freitag, 25. Mai 2012 08:38
-
Hallo Oliver,
vielen Dank für deine Hilfe. Leider stelle ich mich gerade dumm an, denn wenn ich
set @quelle = '\'F:\\Testordner\\Testtext.txt\''
eintrage, dann erhalte ich einen Syntax-Fehler in der Nähe von '\' - also vor dem Laufwerksbuchstaben F:
obwohl ich alles korrekt geschrieben habe. Was übersehe ich dabei?
Volkmar
-
-
Hallo Olaf,
danke auch für deine Hilfe. Jetzt läuft die Prozedur zwar durch, aber ich erhalte folgenden Fehler:
Meldung 4861, Ebene 16, Status 1, Zeile 1
Das Massenladen ist nicht möglich, da die Datei „F:\Test\Test.txt“ nicht geöffnet werden konnte. Betriebssystemfehler 3(Das System kann den angegebenen Pfad nicht finden.).
Die Datei befindet sich am Platz. Hast du dazu eine Idee?
Gruß Volkmar
-
Hallo Volkmar,
kann es sein, das F: kein lokales Laufwerk, sondern ein in Deinem Profil gemapptes Laufwerk ist? Dann kennt der SQL Server natürlich nicht das Laufwerk. Versuche es mit einer UNC Pfadangabe.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing -
Hi,
unter welchem Benutzer läuft dein SQL Server? Kann es evtl. sein, dass der Dienstuser keinen zugriff auf die Datei hat?
Grüße
Oliver
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 5. Juni 2012 15:56
-
Auf Berechtigungen tippe ich auch.
Ich bin mir nicht sicher, aber ich meine, wenn Du per Windows Account an den SQL Server angemeldet bist und OpenRowset direkt aufrufst, kommen Deine Berechtigungen zum Tragen. Verwendet man sp_executesql wird das Dienstkonto des SQL Servers verwendet und dem könnten die Rechte fehlen.
Leg zum Testen die Daten z.B. ins DATA Verzeichnis des SQL Server, dort hat der SQL Server jedenfalls Rechte.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 5. Juni 2012 15:56
-
Hallo Olaf, hallo Oliver,
das war der Fingerzeig in die richtige Richtung. Im DATA-Verzeichnis abgelegt wird die Datei korrekt gefunden und gelesen.
Also hängt es - wider Erwarten - doch an den Rechten des Dienstkontos und da mache ich mich gleich mal auf die Suche.
Prima. Damit ist mein Problem gelöst.
Ich bedanke mich sehr für eure Hilfe und wünsche euch schöne Pfingsttage.
Viele Grüße
Volkmar