将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