Frage

Ich schreibe derzeit eine Anwendung, die mit der SQL Server 2008 -Datenbank eines Drittanbieters mit einem Drittanbieter -Anbieter -Anbieter -Datenbank zugreift, auf die ich nur Lesezugriff habe. Wir haben eine separate Datenbank, die Kreuzdatenbankansichten und gespeicherte Prozeduren in der Datenbank des Anbieters für unsere benutzerdefinierten Anwendungen enthält.

Eine der Spalten enthält Gebäude- und Raumdaten wie diese: Don-203, Don-303, SGREE-102, EVN-1010

Grundsätzlich handelt es sich um eine Reihe von Buchstaben (die das Gebäude anzeigen) gefolgt von einem Bindestrich, gefolgt von Ziffern (die die Raumnummer anzeigen). Ich muss nur Abfragen zum Zimmernummer (numerischer) Teil der Spalte ausführen.

  • Ich kann in der Tabelle keine vorkundige Spalte verwenden, da ich keinen Schreibzugriff auf die ursprüngliche Datenbank habe.
  • Ich kann keine Auslöser in der ursprünglichen Datenbank erstellen
  • Skalarfunktionen geben die richtigen Ergebnisse zurück, scheint aber für große Datensätze unglaublich ineffizient zu sein, die sehr häufig abgefragt werden
  • Soweit ich weiß, kann ich keine indizierte Ansicht verwenden, da sich die Ansicht auf eine Tabelle in einer anderen Datenbank bezieht.
  • Neugebäude können dem Programm jederzeit hinzugefügt werden, sodass ich keine Liste aller Gebäudepräfixe irgendwo harte. Sie sind auch nirgendwo gespeichert.

Gibt es einen anständigen Weg, um mit dieser Situation umzugehen?

Bearbeiten: Hier ist ein Beispielschema (mit allen irrelevanten Daten entfernt)

CREATE TABLE [dbo].[Room]
(
    [RoomID] [int] IDENTITY(0,1) NOT NULL,
    [Description] [varchar](30) NOT NULL,
    CONSTRAINT [PK_Room] PRIMARY KEY CLUSTERED 
    (
            [RoomID] ASC
    )
)

Es gibt einen nicht eindeutigen Index zur Beschreibung in aufsteigender Reihenfolge

Beispieldaten:

RoomID  Description
0       DON-101
1       DON-102
2       DON-103
...
118     DON-427
119     DON-428
...
124     EVN-107
125     EVN-108
...
511     NGRI-1007
512     NGRI-1008
...
564     NGRI-227
565     NGRI-228
War es hilfreich?

Lösung

Dürfen Sie diese Tabelle in einer anderen Datenbank replizieren? Verwendung der Transaktionsreplikation für den neuesten Datenzugriff. Wenn ja, dann würde ich einen umständlichen Prozess testen, wie die Replikation der benötigten Tabelle, eine andere Tabelle oder eine materialisierte Ansicht mit einer berechneten Spalte nach Bedarf zu erstellen.

Wenn die Replikation keine Option ist, würde ich sagen, dass Sie einen geplanten Vorgang festlegen müssen, um diese Tabelle in Ihre Datenbank zu nehmen und lokal fortzufahren, um die Daten zu verarbeiten. Genau wie der erste Vorschlag, aber mit eigenen Skripten und Zeitplänen.

Das oder ich denke, Sie bleiben an den Skalarfunktionen, die aus Sicht der Leistung nicht wirklich die beste Option sind.

Andere Tipps

Mit einer solchen Auswahl können Sie Ihre Beschreibung in einer String- und Ganzzahlspalte aufteilen:

SELECT SUBSTRING(Description,0,CHARINDEX('-',Description)) AS Building,
       CONVERT(INT, SUBSTRING(Description,CHARINDEX('-',Description)+1,LEN(Description))) AS RoomNumber
FROM   Room

Ich bin mir nicht sicher, was Ihr endgültiges Ziel ist, daher weiß ich nicht, ob dies wirklich hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top