2008-09-09 12 views
49

Ich habe eine Tabelle mit einer XML-Spalte. Diese Spalte speichert einige Werte, die ich zum Konfigurieren meiner Anwendung aufbewahre. Ich habe es erstellt, um ein flexibleres Schema zu haben. Ich kann keine Möglichkeit finden, diese Spalte direkt aus der Tabellenansicht in SQL Management Studio zu aktualisieren. Andere Spalten (zB INT oder Varchar) sind editierbar. Ich weiß, dass ich eine UPDATE-Anweisung schreiben oder Code erstellen kann, um es zu aktualisieren. Aber ich suche nach etwas flexiblerem, das Power-Usern das direkte Editieren von XML ermöglicht.SQL SQL-Spalte in SQL Management Studio einfach bearbeiten

Irgendwelche Ideen?

Nochmal wiederholen: Bitte nicht antworten Ich kann eine Bewerbung schreiben. Ich weiß, , und das ist genau das, was ich versuche zu vermeiden.

Antwort

32

Dies ist eine alte Frage, aber ich musste dies heute tun. Am besten kann ich eine Abfrage schreiben, die SQL-Code generiert, der im Abfrageeditor bearbeitet werden kann - das ist zwar etwas lahm, aber es spart Ihnen das Kopieren/Einfügen.

Hinweis: Möglicherweise müssen Sie in Extras> Optionen> Abfrageergebnisse> Ergebnisse in Text gehen und die maximale Anzahl der angezeigten Zeichen so groß wählen, dass sie in Ihre XML-Felder passt.

z.B.

select 'update [table name] set [xml field name] = ''' + 
convert(varchar(max), [xml field name]) + 
''' where [primary key name] = ' + 
convert(varchar(max), [primary key name]) from [table name] 

, die viele Anfragen erzeugt, die wie folgt aussehen (mit einigen Beispieltabelle/Feldnamen):

update thetable set thedata = '<root><name>Bob</name></root>' where thekey = 1 

Sie dann diese Abfragen aus dem Ergebnisfenster bis zu dem Abfrage-Fenster kopieren zurück, Bearbeiten Sie die XML-Zeichenfolgen, und führen Sie dann die Abfragen aus.

(Edit: geändert 10 bis max Fehler zu vermeiden)

1

Ich glaube nicht, dass Sie die GUI von Management Studio verwenden können, um XML-Spalten zu aktualisieren, ohne den UPDATE-Befehl selbst zu schreiben.

Eine Möglichkeit, wie Benutzer xml-data aktualisieren können, besteht darin, ein einfaches .net-basiertes Programm (winforms oder asp.net) zu schreiben und dann die Daten von dort auszuwählen/zu aktualisieren. Auf diese Weise können Sie die Daten auch bereinigen und auf einfache Weise vor dem Einfügen/Aktualisieren der Informationen mit einem bestimmten Schema validieren.

2

Ich beendete das Schreiben eines .net C# UI, um mit den XML-Daten umzugehen. Die Verwendung von xsl für die Anzeige und ein XML-Schema haben dazu beigetragen, das XML schön darzustellen und seine Integrität zu bewahren.

edit: Auch enthält C# die xmldocument-Klasse, die das Lesen/Schreiben der Daten vereinfacht.

+1

Bitte, wenn Sie diese Anwendung teilen können .. – IsmailS

0

Ich bin ein wenig unscharf in diesem sind, aber könnten Sie nicht die OPENXML-Methode verwenden, um das XML in relationale Format zu shredden und speichern Sie es wieder in XML, sobald der Benutzer fertig ist?

Wie andere gesagt haben Ich denke, es könnte einfacher sein, eine kleine App zu schreiben, um es zu tun!

+3

Ich weiß, ich kann eine App schreiben. Ich erwähnte es in der Frage :) Bearbeiten von Werten in der Tabellenansicht hat direkt seine Vorteile. Wenn ich es für Zahlen und Strings tun kann, würde ich es auch für XML tun. –

16

sql Server Management Studio fehlt diese Funktion.

kann ich Homer Simpson als Microsoft Projektmanager schlug seinen Kopf mit der Handfläche seiner Hand sehen: „Duh“

Natürlich wollen wir XML-Spalten bearbeiten.

+9

Du meinst "Doh!" ;) – AaronLS

3

@ Jacob Antwort sehr gut funktioniert, obwohl Sie sollten ein hinzufügen ersetzen, wenn Sie XML enthält keine 'Zeichen:

select 'update [table name] set [xml field name] = ''' + 
REPLACE(convert(varchar(max), [xml field name]), '''', '''''') + 
''' where [primary key name] = ' + 
convert(varchar(max), [primary key name]) from [table name] 
0

Das Ignorieren der " ganz einfach "Teil der Frage Titel, hier ist ein riesiger Hack, der ziemlich anständig ist, vorausgesetzt, Sie beschäftigen sich mit kleinen XML-Spalten.

Dies ist ein Proof of Concept ohne viel zu Optimieren. Geschrieben gegen 2008 R2.

--Drop any previously existing objects, so we can run this multiple times. 
IF EXISTS (SELECT * FROM sysobjects WHERE Name = 'TableToUpdate') 
    DROP TABLE TableToUpdate 
IF EXISTS (SELECT * FROM sysobjects WHERE Name = 'vw_TableToUpdate') 
    DROP VIEW vw_TableToUpdate 

--Create our table with the XML column. 
CREATE TABLE TableToUpdate(
    Id INT NOT NULL CONSTRAINT Pk_TableToUpdate PRIMARY KEY CLUSTERED IDENTITY(1,1), 
    XmlData XML NULL 
) 

GO 

--Create our view updatable view. 
CREATE VIEW dbo.vw_TableToUpdate 
AS 
SELECT 
    Id, 
    CONVERT(VARCHAR(MAX), XmlData) AS XmlText, 
    XmlData 
FROM dbo.TableToUpdate 

GO 

--Create our trigger which takes the data keyed into a VARCHAR column and shims it into an XML format. 
CREATE TRIGGER TR_TableToView_Update 
ON dbo.vw_TableToUpdate 
INSTEAD OF UPDATE 

AS 

SET NOCOUNT ON 

DECLARE 
@Id INT, 
@XmlText VARCHAR(MAX) 

DECLARE c CURSOR LOCAL STATIC FOR 
SELECT Id, XmlText FROM inserted 
OPEN c 

FETCH NEXT FROM c INTO @Id, @XmlText 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    /* 
    Slight limitation here. We can't really do any error handling here because errors aren't really "allowed" in triggers. 
    Ideally I would have liked to do a TRY/CATCH but meh. 
    */ 
    UPDATE TableToUpdate 
    SET 
     XmlData = CONVERT(XML, @XmlText) 
    WHERE 
     Id = @Id 

    FETCH NEXT FROM c INTO @Id, @XmlText 
END 

CLOSE c 
DEALLOCATE c 

GO 

--Quick test before we go to SSMS 
INSERT INTO TableToUpdate(XmlData) SELECT '<Node1/>' 
UPDATE vw_TableToUpdate SET XmlText = '<Node1a/>' 
SELECT * FROM TableToUpdate 

Wenn Sie vw_TableToUpdate in SSMS öffnen, werden Sie die „XML“ ändern erlaubt, die den „echten“ XML-Wert dann aktualisieren.

Wieder, hässlicher Hack, aber es funktioniert für was ich es tun muss.

0

Ich habe eine billige und fiese Workaround, aber ist in Ordnung. Also, eine Abfrage des Datensatzes, das heißt

SELECT XMLData FROM [YourTable] 
WHERE ID = @SomeID 

Klicken Sie auf das XML-Datenfeld, die ‚Hyperlinks‘ werden sollte. Dies öffnet das XML in einem neuen Fenster. Bearbeiten, kopieren und fügen Sie den XML zurück in ein neues Abfragefenster:

UPDATE [YourTable] SET XMLData = '<row><somefield1>Somedata</somefield1> 
            </row>' 
WHERE ID = @SomeID 

Aber ja, wir desparately müssen in der Lage zu bearbeiten. Wenn Sie Mr. Soft hören, schauen Sie sich bitte Oracle an, Sie können XML in ihrem Mgt Studio Äquivalent bearbeiten. Lassen Sie uns es zu einem Versehen kreieren, ich bin immer noch ein großer Fan von SQL-Server.

Verwandte Themen