SqlServer OpenXML函数忽略表中自增列

在使用openxml打开xml文档时,如果在with子句中指定以TableName进行架构信息表示时,如果指定表中存在自增列,

则这里的自增列将不会出现在openxml返回的最终行集中。


具体参照以下代码:

1、含有自增列的表



CREATE TABLE TestOpenxmlIdentity(
SomeID INT IDENTITY(1,1),
NAME VARCHAR(100)
)


INSERT INTO TestOpenxmlIdentity
(
-- SomeID -- this column value is auto-generated
NAME
)
SELECT 'jim'
UNION
SELECT 'tom'
UNION
SELECT 'jerry'


DECLARE @tmpXml NVARCHAR(MAX)=
CONVERT(NVARCHAR(MAX),
(SELECT *
FROM TestOpenxmlIdentity AS di
FOR XML PATH('row'),ROOT('root'))
)


SELECT @tmpXml


DECLARE @idoc INT,@prepareXml INT
BEGIN TRY
EXEC sp_xml_preparedocument  @idoc OUTPUT,@tmpXml
SET @prepareXml=1


SELECT    *
FROM       OPENXML (@idoc, '/root/row',2)
WITH TestOpenxmlIdentity
--(NAME VARCHAR(100),
-- Age INT,
-- ADDRESS VARCHAR(100)
--)
EXEC sp_xml_removedocument @idoc
SET @prepareXml=0
END TRY
BEGIN CATCH
/* 
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage
*/
IF(@prepareXml=1)
BEGIN
EXEC sp_xml_removedocument @idoc
END
END CATCH


执行结果



(3 行受影响)


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1jerry2jim3tom


(1 行受影响)


NAME
----------------------------------------------------------------------------------------------------
jerry
jim
tom


(3 行受影响)

可以看到返回结果集中,SomeID列丢失了。


那如果要想返回这个列,我们可以通过自己定义列模式来完成



CREATE TABLE TestOpenxmlIdentity(
SomeID INT IDENTITY(1,1),
NAME VARCHAR(100)
)


INSERT INTO TestOpenxmlIdentity
(
-- SomeID -- this column value is auto-generated
NAME
)
SELECT 'jim'
UNION
SELECT 'tom'
UNION
SELECT 'jerry'


DECLARE @tmpXml NVARCHAR(MAX)=
CONVERT(NVARCHAR(MAX),
(SELECT *
FROM TestOpenxmlIdentity AS di
FOR XML PATH('row'),ROOT('root'))
)


SELECT @tmpXml


DECLARE @idoc INT,@prepareXml INT
BEGIN TRY
EXEC sp_xml_preparedocument  @idoc OUTPUT,@tmpXml
SET @prepareXml=1


SELECT    *
FROM       OPENXML (@idoc, '/root/row',2)
WITH 
--TestOpenxmlIdentity
(SomeID INT,
NAME VARCHAR(100)
)

EXEC sp_xml_removedocument @idoc
SET @prepareXml=0
END TRY
BEGIN CATCH
/* 
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage
*/
IF(@prepareXml=1)
BEGIN
EXEC sp_xml_removedocument @idoc
END
END CATCH


DROP TABLE TestOpenxmlIdentity


返回结果



(3 行受影响)


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1jerry2jim3tom


(1 行受影响)


SomeID      NAME
----------- ----------------------------------------------------------------------------------------------------
1           jerry
2           jim
3           tom


(3 行受影响)


2、不含有自增列的表



CREATE TABLE TestOpenxmlIdentity(
SomeID INT,
NAME VARCHAR(100)
)


INSERT INTO TestOpenxmlIdentity
(
SomeID, -- this column value is auto-generated
NAME
)
SELECT 1, 'jim'
UNION
SELECT 2,'tom'
UNION
SELECT 3,'jerry'


DECLARE @tmpXml NVARCHAR(MAX)=
CONVERT(NVARCHAR(MAX),
(SELECT *
FROM TestOpenxmlIdentity AS di
FOR XML PATH('row'),ROOT('root'))
)


SELECT @tmpXml


DECLARE @idoc INT,@prepareXml INT
BEGIN TRY
EXEC sp_xml_preparedocument  @idoc OUTPUT,@tmpXml
SET @prepareXml=1


SELECT    *
FROM       OPENXML (@idoc, '/root/row',2)
WITH 
TestOpenxmlIdentity
--(SomeID INT,
-- NAME VARCHAR(100)
--)
EXEC sp_xml_removedocument @idoc
SET @prepareXml=0
END TRY
BEGIN CATCH
/* 
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage
*/
IF(@prepareXml=1)
BEGIN
EXEC sp_xml_removedocument @idoc
END
END CATCH


DROP TABLE TestOpenxmlIdentity


执行结果:



(3 行受影响)


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1jim2tom3jerry


(1 行受影响)


SomeID      NAME
----------- ----------------------------------------------------------------------------------------------------
1           jim
2           tom
3           jerry


(3 行受影响)


你可能感兴趣的:(SQL,SERVER,数据库)