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返回的最终行集中。
具体参照以下代码:
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 行受影响)
相关文章推荐
- XML 与 JSON 优劣对比
- As3.0 xml + Loader应用代码
- 网马生成器 MS Internet Explorer XML Parsing Buffer Overflow Exploit (vista) 0day
- ext读取两种结构的xml的代码
- 推荐Sql server一些常见性能问题的解决方法
- C#针对xml基本操作及保存配置文件应用实例
- Ruby程序中创建和解析XML文件的方法
- asp下查询xml的实现代码
- sqlserver FOR XML PATH 语句的应用
- 使用sp_xml_preparedocument处理XML文档的方法
- SQL Server存储过程的基础说明
- EBS xml publisher中文乱码问题及解决办法
- C#中的Linq to Xml详解
- C#操作XML文件实例汇总
- SQL Server中的XML数据进行insert、update、delete
- C#采用OpenXml给Word文档添加表格
- SQL Server下几个危险的扩展存储过程
- 如何在SQL Server 2008下轻松调试T-SQL语句和存储过程
- SQL Server中选出指定范围行的SQL语句代码