关键词:xml数据转为行列方式显示

常规案例:

  

declare @data xml
declare @h int
set @data='
<bookstore>
<row>
<province_id></province_id>
<code></code>
<name>北京市</name>
</row>
<row>
<province_id></province_id>
<code></code>
<name>上海</name>
</row>
</bookstore>
' exec sp_xml_preparedocument @h output,@data
select * from openxml(@h,'//row',)
with
(
province_id int,
code Varchar(),
name Varchar()
)
exec sp_xml_removedocument @h
 

触发器中的XML解析

【1】数据库级别DDL操作监控审计

SQL Server 2005开始支持DDL触发器,它不只限于对CREATE/ALTER/DROP操作有效,支持的DDL事件还有比如:权限的GRANT/DENY/REVOEK, 对象的RENAME, 更新统计信息等等,可通过DMV查看更多支持的事件类型如下:

select * from sys.trigger_event_types
where type_name not like '%CREATE%'
and type_name not like '%ALTER%'
and type_name not like '%DROP%'
注意: 1. TRUNCATE不在DDL触发器的事件类型中,SQL Server中将Truncate 归为DML操作语句,虽然它也并不触发DML触发器,就像开启开关的大批量导入操作 (Bulk Import Operations) 一样; 2. DDL触发器中捕获的信息都由EVENTDATA()函数返回,返回类型为XML格式,需要用XQuery来读取; 案例:转自2012示例库,只能数据库级别,不能实例级别 复制代码
use database
go SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create table databaseLog( [PostTime] datetime,
[DatabaseUser] varchar(500),
[Event] varchar(500),
[Schema] varchar(50),
[Object] varchar(4000),
[TSQL] varchar(4000),
[XmlEvent] xml) CREATE TRIGGER [ddlDatabaseTriggerLog] ON DATABASE --all server 实例级别
FOR DDL_DATABASE_LEVEL_EVENTS AS  --DDL_SERVER_LEVEL_EVENTS 实例级别
BEGIN
SET NOCOUNT ON; DECLARE @data XML;
DECLARE @schema sysname;
DECLARE @object sysname;
DECLARE @eventType sysname; SET @data = EVENTDATA();
SET @eventType = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'sysname');
SET @schema = @data.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname');
SET @object = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname') IF @object IS NOT NULL
PRINT ' ' + @eventType + ' - ' + @schema + '.' + @object;
ELSE
PRINT ' ' + @eventType + ' - ' + @schema; IF @eventType IS NULL
PRINT CONVERT(nvarchar(max), @data); INSERT [dbo].[DatabaseLog]
(
[PostTime],
[DatabaseUser],
[Event],
[Schema],
[Object],
[TSQL],
[XmlEvent]
)
VALUES
(
GETDATE(),
CONVERT(sysname, CURRENT_USER),
@eventType,
CONVERT(sysname, @schema),
CONVERT(sysname, @object),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)'),
@data
);
END; GO SET ANSI_NULLS OFF
GO SET QUOTED_IDENTIFIER OFF
GO --开启/关闭
ENABLE TRIGGER [ddlDatabaseTriggerLog] ON DATABASE
DISABLE TRIGGER [ddlDatabaseTriggerLog] ON DATABASE
GO --删除
DROP TRIGGER tri_LogServerEvent ON DATABASE; --添加扩展属性到数据库对象中(即添加数据字典注解)
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Database trigger to audit all of the DDL changes made to the AdventureWorks2008R2 database.' ,
@level0type=N'TRIGGER',@level0name=N'ddlDatabaseTriggerLog' GO

最新文章

  1. Java学习之LinkedHashMap学习总结
  2. ACM集训的Day3 B。。。盲目搜索之DFS。。。
  3. August 9th 2016, Week 33rd Tuesday
  4. 微信小程序学习
  5. linux根分区扩容
  6. html5 drap &amp; drop
  7. LinqToSql和ASP.NET Entity FrameWork 中使用事务
  8. 网络笔记02数据解析 -1-JSON解析
  9. URAL 1777 D - Anindilyakwa 暴力
  10. linux守护进程解读
  11. linux环境下的线程的创建问题
  12. sql 注入命令大全
  13. 【旋转卡壳+凸包】BZOJ1185:[HNOI2007]最小矩形覆盖
  14. 深入浅出解读 Java 虚拟机的差别测试技术
  15. sql多字段相减///单字段多值
  16. C#正则Groups高级使用方法
  17. flask-admin 快速打造博客 系列一
  18. Apache模块 mod_proxy
  19. Spring 无缝整合 quartz
  20. python 安装wheel .whl文件

热门文章

  1. 详解WebService开发中四个常见问题(1)
  2. autogen.sh 的使用
  3. 【NOIP2016提高A组模拟9.15】Map
  4. layui静态表格固定td宽度,table固定td宽度
  5. 电脑右键新建没有xmind文件选项解决方法
  6. UVa 129 Krypton Factor (DFS &amp;&amp; 回溯)
  7. TTTTTTTTTTTTTTTTTT POJ 1330
  8. python-opencv中的cv2.inRange函数
  9. java复制项目中的补丁,完整的包路径
  10. WebView:是应用程序打开web网页的UI控件前台