So laden Sie eine Datei mit T-SQL aus einer varbinären Spalte herunter

srh

Ich arbeite mit SQL Server 2016. Ich habe eine Tabelle file_data habe , die eine Spalte Daten von varbinaryTyp.

CREATE TABLE [dbo].[file_data]
(
    [file_data_id] [INT] IDENTITY(1,1) NOT NULL,
    [file_name] [VARCHAR](20) NOT NULL,
    [description] [VARCHAR](255) NOT NULL,
    [data] [VARBINARY](MAX) FILESTREAM  NOT NULL,
    [file_guid] [UNIQUEIDENTIFIER] ROWGUIDCOL  NOT NULL,

    CONSTRAINT [pk_file_data] 
        PRIMARY KEY CLUSTERED ([file_data_id] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] FILESTREAM_ON [filestream],
    UNIQUE NONCLUSTERED ([file_guid] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] FILESTREAM_ON [filestream]
GO

Das Datenspalte speichert 1 - Datei in der Regel eine txt - Datei. Diese Tabelle hat also mehrere Zeilen.

Wie kann ich mit T-SQL eine Datei einer beliebigen Zeile aus der Datenspalte herunterladen ? Ich verwende Microsoft SQL Server Management Studio.

Shnugo

EDIT: Ich habe gerade Ihre Frage noch einmal gelesen und ich denke, ich habe das Problem falsch verstanden ...

Die Zeile Also diese Tabelle hat mehrere Zeilen hat mich süchtig ...

Wenn Sie nicht mehr als den binären Inhalt einer Tabellenspalte in das Dateisystem übertragen möchten, können Sie Folgendes verwenden BCP(siehe die verknüpfte Antwort und beachten Sie, dass dies nicht unter Ihrem Konto funktioniert , sodass Zugriffsrechte und Zielverzeichnisse möglicherweise auftreten nicht das sein, was du erwartest). Aber ich würde ein externes Tool verwenden, wahrscheinlich Powershell, eine Verbindung zur Datenbank herstellen und einfach den Inhalt in eine Datei lesen.

Ich werde meine frühere Antwort nicht löschen, da dies ebenfalls hilfreich sein kann.

Ich bin mir ziemlich sicher, dass T-SQL das falsche Werkzeug dafür ist. Meine Antwort könnte Ihnen helfen, sie wird zumindest einige Prinzipien zeigen ...

Eine BLOB-Spalte (in Ihrem Fall VARBINARY(MAX)) ist nichts anderes als eine bedeutungslose Kette von Bytes. SQL-Server hat keine Ahnung, wie dies als aussagekräftige Daten zu interpretieren ist.

Ich benutze ein einfaches String - Variable auf Mockup eine Datei Inhalts:

DECLARE @TestText VARCHAR(MAX)=
N'This is the first line
This is the second line';

- Jetzt wird diese Zeichenfolge in varbinary umgewandelt und einer BLOB-Variablen zugewiesen.
- Dies ist - im Prinzip - das, was Sie in Ihrer Kolumne haben

DECLARE @YourFileStore VARBINARY(MAX)=CAST(@TestText AS VARBINARY(MAX));
SELECT @YourFileStore;

- Das bekommst du zurück

0x5468697320697320746865206669727374206C696E650D0A5468697320697320746865207365636F6E64206C696E65

--dies ist eine HEX-Zeichenfolge, bei der jeweils zwei Ziffern ein Zeichen darstellen (die 54 ist die T, die 68 die husw.). -
Irgendwo in der Mitte finden Sie die Sequenz 0D0A, die den Zeilenumbruch darstellt.
- Solange wir wissen, wie die Binärdatei zu interpretieren ist , können wir sie einfach in den vorherigen Typ umwandeln. Dadurch wird der frühere String zurückgegeben:

SELECT CAST(@YourFileStore AS VARCHAR(MAX));

--Das Lesen dieser Zeile für Zeile erfordert eine Zeichenfolgenaufteilung an den Zeilenumbrüchen.
- Sie haben die Version Ihres SQL-Servers nicht angegeben. Hier benutze ich OPENJSON(braucht v2016 +).

SELECT *
FROM OPENJSON('["' + REPLACE(CAST(@YourFileStore AS VARCHAR(MAX)),CHAR(13)+CHAR(10),'","') + '"]');

Wann wird das für Sie funktionieren:

Dies kann für Sie funktionieren, wenn alle BLOBs den gleichen Inhalt (in der Struktur) haben und SQL-Server einen einfachen CASToder CONVERTeinen aussagekräftigen Datentyp verwenden kann.

Wann wird das bei Ihnen nicht funktionieren:

Wenn die Textdateien nicht einfach sind UCS-2(fast das gleiche wie UTF-16), was übersetzt NVARCHAR(MAX)oder einfach ASCII , was übersetzt VARCHAR(MAX).

Jede Codierung (wie utf-8), der falsche Endian oder ASCII> 127 (nach Kollatierungen suchen ) kann nur Müll zurückgeben.

Was du machen solltest:

Wenn diese einfache Besetzung Ihnen hilft, die Daten zu lesen - na ja - dann haben Sie Glück. Wenn nicht, sollten Sie ein anderes Tool mit mehr Fähigkeiten im Umgang mit Zeichenfolgen verwenden.

Sie sollten Daten immer im entsprechenden Typ speichern . BLOBs sind für Daten gedacht, bei denen Sie nicht nach innen schauen möchten (wie ein Bild). Ihre Daten sollten in separaten Zeilen mit einer gemeinsamen ID und einer Zeilennummer gespeichert werden, um den vollständigen Text neu zu erstellen.

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel