none
String in SP austauschen RRS feed

  • 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

    Freitag, 25. Mai 2012 07:44

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

    Freitag, 25. Mai 2012 10:20
  • 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

    Freitag, 25. Mai 2012 10:39

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

    Freitag, 25. Mai 2012 07:56
  • @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


    Freitag, 25. Mai 2012 08:37
  • 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

    Freitag, 25. Mai 2012 08:41
  • Hi,

    das \ ist für die Auserkraftsetzung des '

    Bei meinem Management Studio 2012 funktioniert das einwandfrei. Bei SQL 2005 kann es sein, dass nur die Syntax von Olaf funktioniert. Mit drei '

    Also dann: '''F:\Testordner\Testtext.txt'''

    Grüße

    Oliver

    Freitag, 25. Mai 2012 08:51
  • 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

    Freitag, 25. Mai 2012 09:39
  • 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

    Freitag, 25. Mai 2012 09:49
  • Hallo Olaf,

    es ist schon ein lokales Laufwerk und in der "fixen" Version der Prozedur liest der SQL Server die Datei auch korrekt ein.

    Es muss einen anderen Grund geben.

    Freitag, 25. Mai 2012 10:06
  • 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

    Freitag, 25. Mai 2012 10:20
  • Hallo Oliver,

    der SQL Server läuft unter einem eigens dafür eingerichteten Dienstkonto und das hat alle erforderlichen Rechte.

    Es ist schon merkwürdig.

    Gruß Volkmar

    Freitag, 25. Mai 2012 10:37
  • 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

    Freitag, 25. Mai 2012 10:39
  • 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

    Freitag, 25. Mai 2012 10:54