您的位置:首页 > 数据库 > SQL

SqlServer OpenXML函数忽略表中自增列

2016-02-19 11:23 633 查看
在使用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 行受影响)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

<root><row><SomeID>1</SomeID><NAME>jerry</NAME></row><row><SomeID>2</SomeID><NAME>jim</NAME></row><row><SomeID>3</SomeID><NAME>tom</NAME></row></root>

(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 行受影响)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

<root><row><SomeID>1</SomeID><NAME>jerry</NAME></row><row><SomeID>2</SomeID><NAME>jim</NAME></row><row><SomeID>3</SomeID><NAME>tom</NAME></row></root>

(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 行受影响)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

<root><row><SomeID>1</SomeID><NAME>jim</NAME></row><row><SomeID>2</SomeID><NAME>tom</NAME></row><row><SomeID>3</SomeID><NAME>jerry</NAME></row></root>

(1 行受影响)

SomeID      NAME

----------- ----------------------------------------------------------------------------------------------------

1           jim

2           tom

3           jerry

(3 行受影响)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  openxml SQL Server xml