将JSON表转换为XML表(SQL Server)

将JSON表转换为XML表(SQL Server),sql,sql-server,json,xml,sql-server-2014,Sql,Sql Server,Json,Xml,Sql Server 2014,当更新或插入TableJSON时(在触发器中),如何将TableJSON中的所有JSON列[nvarchar(max)]转换为TableXML中的XML列 获取所有nvarchar(max)列: DECLARE @COLUMN_NAME nvarchar(max) SELECT @COLUMN_NAME = COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TableJSON' AND DATA_TYPE LI

当更新或插入
TableJSON
时(在触发器中),如何将
TableJSON
中的所有JSON列[
nvarchar(max)
]转换为
TableXML
中的XML列

获取所有
nvarchar(max)
列:

DECLARE @COLUMN_NAME nvarchar(max)

SELECT @COLUMN_NAME = COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TableJSON' 
  AND DATA_TYPE LIKE 'nvarchar' 
  AND CHARACTER_MAXIMUM_LENGTH = -1 --NVARCHAR(MAX)
将JSON转换为XML:

TableJSON:

   ID        bigint,
   Code      char(10),
   Field1    nvarchar(max),
   ...
   Field100  nvarchar(max)
TableXML:

   ID        bigint,
   Code      char(10),
   Field1    xml,
   ...
   Field100  xml
我的触发器(当前仅适用于
字段1
):

如何将所有JSON列从
TableJSON
转换为
TableXML
中的XML列?

您的触发器有一个重大缺陷,您似乎认为它每行调用一次-事实并非如此。触发器将对每条语句触发一次,因此,如果导致此触发器触发的
INSERT
语句插入了25行,则触发器将触发一次,但是
Inserted
伪表将包含25行。您的代码将在此处选择这25行中的哪一行<代码>选择。。。。从插入的-这是不确定的,您将得到一个任意行,并将忽略所有其他行。你需要重写你的触发器来考虑这一点!
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[UpdateXMLTable]
ON [dbo].[TableJSON]
AFTER INSERT, UPDATE
AS 
BEGIN
    DECLARE @ID bigint
    DECLARE @Field1 nvarchar(max)
    DECLARE @MyHierarchy Hierarchy,@Field1XML XML

    SELECT  @ID = ID,
            @Field1 = Field1
    FROM INSERTED

    INSERT INTO @myHierarchy
    SELECT * FROM parseJSON(@Field1)
    SELECT dbo.ToXML(@MyHierarchy)
    SET @Field1XML = dbo.ToXML(@MyHierarchy)

    IF NOT EXISTS(SELECT 1 FROM [dbo].[TableXML] WHERE ID = @ID)
        INSERT INTO [dbo].[TableXML] (ID, Field1) VALUES (@ID, @Field1XML)
    ELSE 
        IF (UPDATE (Field1))
            UPDATE [dbo].[TableXML] SET Field1 = @Field1XML WHERE ID = @ID
END