programing

SQL Management Studio에서 SQL XML 열을 쉽게 편집하는 방법

starjava 2023. 8. 25. 23:10
반응형

SQL Management Studio에서 SQL XML 열을 쉽게 편집하는 방법

XML 열이 있는 테이블이 있습니다.이 열에는 응용 프로그램을 구성하기 위해 보관하는 몇 가지 값이 저장되어 있습니다.좀 더 유연한 스키마를 사용하기 위해 만들었습니다.SQL Management Studio의 테이블 보기에서 이 열을 직접 업데이트할 수 없습니다.다른 열(예: INT 또는 Varchar)은 편집할 수 있습니다.업데이트 문을 작성하거나 코드를 생성하여 업데이트할 수 있습니다.하지만 저는 파워 유저들이 XML을 직접 편집할 수 있는 좀 더 유연한 것을 찾고 있습니다.

아이디어 있어요?

다시 한 번 반복합니다.제발 대답하지 마세요. 저는 신청서를 쓸 수 있습니다.저도 알아요, 그리고 그게 바로 제가 피하려는 것입니다.

이것은 오래된 질문이지만, 저는 오늘 이것을 해야만 했습니다.제가 생각해낼 수 있는 최선의 방법은 쿼리 편집기에서 편집할 수 있는 SQL 코드를 생성하는 쿼리를 작성하는 것입니다. 다소 구질구질하지만 복사/붙여넣기 작업을 절약할 수 있습니다.

참고: [도구] > [옵션] > [쿼리 결과] > [결과]에서 [텍스트]로 이동하여 XML 필드에 적합할 만큼 충분히 큰 숫자로 표시되는 최대 문자 수를 설정해야 할 수 있습니다.

예.

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]

이는 다음과 같은 많은 쿼리를 생성합니다(일부 샘플 테이블/필드 이름 포함).

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

그런 다음 이러한 쿼리를 결과 창에서 쿼리 창으로 다시 복사하고 xml 문자열을 편집한 다음 쿼리를 실행합니다.

(편집: 오류를 방지하기 위해 10을 최대값으로 변경)

sql server management studio에 이 기능이 없습니다.

저는 호머 심슨이 마이크로소프트 프로젝트 매니저로서 손바닥으로 머리를 쾅쾅 치고 있는 것을 볼 수 있습니다. "우!"

물론 xml 열을 편집하고 싶습니다.

저는 xml 데이터를 처리하기 위해 .net c# UI를 작성하게 되었습니다.xsl을 표시에 사용하고 xml 스키마를 사용하면 xml을 올바르게 표시하고 무결성을 유지할 수 있습니다.

edit: 또한 c#에는 데이터 읽기/쓰기를 단순화하는 xmldocument 클래스가 포함되어 있습니다.

@Jacob의 답변은 매우 잘 작동하지만 XML에 '문자가 포함된 경우 REPLACE를 추가해야 합니다.

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]

저는 싸고 형편없는 해결책이 있지만 괜찮습니다.기록을 조회합니다.

SELECT XMLData FROM [YourTable]
WHERE ID = @SomeID

xml 데이터 필드를 클릭합니다. 이 필드는 '하이퍼링크'여야 합니다.새 창에서 XML이 열립니다.편집한 다음 XML을 복사하여 새 쿼리 창에 다시 붙여넣습니다.

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

하지만 네, WE는 편집할 수 있어야 합니다.Mr. Soft를 듣고 있다면 Oracle을 참조하십시오. Mgt Studio에 해당하는 XML을 편집할 수 있습니다.저는 여전히 SQL 서버의 열렬한 팬입니다.

질문 제목의 "쉬운" 부분을 무시하고, 작은 XML 열을 다루는 경우 상당히 괜찮은 거대한 해킹이 있습니다.

이것은 최적화에 대한 고려 없이 개념을 증명하는 것입니다.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

SSMS에서 vw_TableToUpdate를 열면 "XML"을 변경할 수 있으며, "실제" XML 값이 업데이트됩니다.

다시 말하지만, 추악한 해킹이지만, 제가 해야 할 일에는 효과가 있습니다.

UPDATE 명령어를 직접 작성하지 않고는 Management Studio GUI를 사용하여 XML 열을 업데이트할 수 없다고 생각합니다.

사용자가 xml-data를 업데이트할 수 있는 한 가지 방법은 간단한 .net 기반 프로그램(winforms 또는 asp.net )을 작성한 다음 거기서 데이터를 선택/업데이트하는 것입니다.이렇게 하면 정보를 삽입/업데이트하기 전에 데이터를 검사하고 지정된 스키마에 대해 쉽게 유효성을 검사할 수도 있습니다.

저는 이 분야에 대해 조금 모호하지만 OPENXML 방법을 사용하여 XML을 관계형 형식으로 조각한 다음 사용자가 완료되면 XML로 다시 저장할 수 없습니까?

다른 사람들이 말한 것처럼, 나는 그것을 하기 위해 작은 앱을 쓰는 것이 더 쉬울 것이라고 생각합니다!

또 다른 무응답입니다.당신은 LinqPad를 사용할 수 있습니다.(https://www.linqpad.net/) .XML 필드를 포함하여 SQL 행을 편집할 수 있습니다.LINQ에 관심이 없는 경우 SQL을 통해 편집할 행을 쿼리할 수도 있습니다.

빈 XML 값을 NULL 값으로 편집하는 것이 문제였습니다.SSMS에서 값이 공백으로 표시되었습니다.그러나 LinqPad에서는 null로 표시되었습니다.그래서 저는 LinqPad에서 변경사항을 저장하기 위해 null로 변경한 후 다시 null로 변경해야 했습니다.이제 SSMS에서도 null로 표시됩니다.

저는 이것이 정말 오래된 질문이라는 것을 알지만 이것이 누군가에게 도움이 되기를 바랍니다.

질문과 같이 업데이트 명세서나 애플리케이션을 작성하지 않으려는 경우 파워 유저라는 점에서 다음과 같은 사항이 도움이 될 것으로 생각합니다.

XML 열을 varchar로 변경하면 SSMS 편집 테이블 화면에서 이 열을 수정할 수 있습니다.SSMS 테이블 디자이너를 사용하여 열을 변경할 수 없습니다.다음 스크립트가 작동했습니다.

ALTER TABLE [tablename]
ALTER COLUMN [columnname] varchar(max);

편집을 마쳤으면 열을 XML로 다시 변경합니다.

ALTER TABLE [tablename]
ALTER COLUMN [columnname] XML;

언급URL : https://stackoverflow.com/questions/53026/how-to-easily-edit-sql-xml-column-in-sql-management-studio

반응형