sql/plus 如何sql生成xmll一个row一条

Posts - 158,
Articles - 0,
Comments - 678
人生如棋,我愿为卒,行动虽缓,可谁曾见我后退过!
17:18 by BIWORK, ... 阅读,
Execute SQL Task 这个控件在微软BI ETL 项目中使用的频率还是非常高的,也是大部分入门 SSIS 初学者最早接触到的几个控制流控件。
我们通常使用 Execute SQL Task 的场景包含但不止于以下几类:
在从源端加载数据到 Staging 表之前使用 Execute SQL Task 执行一些 Truncate 操作。
执行一些 Log 的插入,更新操作。
ETL 过程中的 Merge 语句操作。
XML 的输出处理。
关于如何使用 Execute SQL Task 就不在本文讲解了,包括参数传递 Input,存储过程返回值 Output,包括 Return Value ,还有 SQL Source Type 等不同方式以及 OLD DB,ADO.NET 区别等基础概念文本也不会涉及到。
本文要讲解的内容是针对 ResultSet 的几种类型:None, Single row, Full result set, XML。其中 None 不用讲解,关于 XML 的内容大家可以参考我的另一篇文章 ,因此在这里只讲解 Single Row 和 Full Result Set 的处理方法。
Single Row &
首先,Single Row 指的就是在 Execute SQL Task 中返回的就是一个单行的记录,允许多列。
通常在 Execute SQL Task 中使用 Single Row 的时候是为了在控制流中控制流程的流转,满足一定的条件走一个分支流程,不满足则走另外一个流程。
比如,在包执行之初查询数据库检查一下包的某些状态,或者数据的某些状态,只有在满足达到一定条件下才能执行剩下的流程,否则则不执行包或者报错。这类设计在各种不同的BI项目中可能都存在,那么其原型就是利用 Execute SQL Task 中的 Single Row返回的值来控制流程。
有以下几个步骤:
SQL Statement 中的语句返回单行记录,可以多列。
需要在包中实现定义变量用来接收 Single Row 的某列上的值。
使用 Precedence Constraint 和变量来控制流程。
Single Row 案例
一条简单的查询语句返回一个单行双列的记录。
设置好连接并放好SQL语句,选择 Single Row。
添加三个变量
EXISTING_COUNT - 用来接收查询中的返回的COUNT数。
MAX_DATE - 用来接收查询中返回的最大时间。
TEST_DATE - 测试时间,比如说 。
0 表示 Single Row 中的第一列,1 表示 Single Row 中的第二列。
下面放两个空的 Data Flow Task 并关联到 Execute SQL Task,点击连接线设置条件控制。
DFT_TEST_AFTER_MAX 上的连接线条件判断为:DATEDIFF( "dd", (DT_DBDATE) (@[User::TEST_DATE]) , (DT_DBDATE) (@[User::MAX_DATE])) &=0
DFT_TEST_BEFORE_MAX上的判断表达式为:DATEDIFF( "dd", (DT_DBDATE) (@[User::TEST_DATE]) , (DT_DBDATE) (@[User::MAX_DATE])) &0
左右两个数据流下各加入一个 Script Task 显示一下这几个变量的值,代码如下:
public void Main()
// TODO: Add your code here
//User::EXISTING_COUNT,User::MAX_DATE,User::TEST_DATE
string existing_count = Dts.Variables["User::EXISTING_COUNT"].Value.ToString();
string max_date = Dts.Variables["User::MAX_DATE"].Value.ToString();
string test_date = Dts.Variables["User::TEST_DATE"].Value.ToString();
MessageBox.Show("Existing Count - " + existing_count + ", test date - " + test_date + ", max date - " + max_date);
Dts.TaskResult = (int)ScriptResults.S
保存并执行包,流程走了右边,因为 MAX DATE 要比 TEST DATE 大。
修改 TEST_DATE,那么 TEST DATE 要比 MAX DATE 大。
这就是 Execute SQL Task 中 Single Row 的使用方法。
FULL Result Set
通常在 Execute SQL Task 中使用到 FULL Result Set 就一定会结合 Foreach Loop 来使用,所适用的场景是循环便利查询结果集中的每一行数据,将每一行的数据其中某几列取出来放入到变量中,然后同样在 Foreach Loop 中的其它控制流控件使用这些变量做一些操作。
像这种遍历为什么不放到数据库中直接遍历不是更好吗?问题就在于,有时操作的对象并不仅仅是数据库中的表对象,而是涉及到不同的文件处理,这时就需要使用这种方式了。比如,我的目标数据源中有几百个文件,且文件的命名包括产品的名称,现在表中有产品名称的记录。需要循环遍历表中的产品,并对比哪些文件命名包含有这些产品名称,包含产品名称的文件则抽取数据,不包含产品名称的文件则移到其它目录。
下面使用这个查询作为一个示例结果集 -
使用 FULL RESULT SET &
定义如下几个变量 - ORDER_SET 用来保存 Execute SQL Task 查询中的结果集,其它变量用来在循环每一行的时候保存每一列的值。注意:返回的结果集要使用 OBJECT 类型的变量来保存,这个 OBJECT 类型在内部以集合的形式存在并保存整个查询结果集。
EXECUTE SQL TASK 的 Mapping。
Foreach 下的设置
我们可以通过 Foreach 的方式循环遍历这个返回的集合。添加一个 Foreach 控件,并设置遍历方式 - Foreach ADO Enumerator 和要遍历的集合对象。
遍历这个集合的时候,每次返回一行,这一行也是一个集合,通过设置索引0,1,2 将这个集合的元素赋值给各个变量。
在 Foreach 控件中添加一个 Script Task 用来显示每一行中各列的内容。
Script 中的脚本代码如下:
public void Main()
// TODO: Add your code here
//User::PRODUCT_ID,User::SALES_ORDER_DETAIL_ID,User::UNIT_PRICE
string detailID = Dts.Variables["User::SALES_ORDER_DETAIL_ID"].Value.ToString();
string productID = Dts.Variables["User::PRODUCT_ID"].Value.ToString();
string unitPrice = Dts.Variables["User::UNIT_PRICE"].Value.ToString();
MessageBox.Show("Detail ID - " + detailID+", Product ID - "+productID +", Unite Price - "+ unitPrice);
Dts.TaskResult = (int)ScriptResults.S
保存并执行包,第一次循环的结果是失败的,但是可以看出来我们的结果集返回是没有问题的。
出错的原因如下:
Error: The type of the value (String) being assigned to variable "User::SALES_ORDER_DETAIL_ID" differs from the current variable type (Int32). Variables may not change type during execution. Variable types are strict, except for variables of type Object.
Error: The type of the value (String) being assigned to variable "User::PRODUCT_ID" differs from the current variable type (Int32). Variables may not change type during execution. Variable types are strict, except for variables of type Object.
Error: The type of the value (String) being assigned to variable "User::UNIT_PRICE" differs from the current variable type (Decimal). Variables may not change type during execution. Variable types are strict, except for variables of type Object.
这是由于在集合中的数据默认都是 String 类型的,是不能够直接转换成我们定义的变量所指定的类型,因此需要修改我们的变量类型。
再次执行就可以看到遍历的效果,第一次 -
最后一次 -&
Script Task 中的循环遍历
同样的 Object 对象,不仅仅可以在 Foreach 中循环遍历,也可以直接在 Script Task 中循环遍历。
添加一个 Script Task,把结果集对象放入变量列表中。
脚本代码如下 -&
using System.Data.OleDb;
public void Main()
// TODO: Add your code here
OleDbDataAdapter adapter = new OleDbDataAdapter();
DataTable dataTable = new DataTable();
adapter.Fill(dataTable, Dts.Variables["User::ORDER_SET"].Value);
foreach (DataRow row in dataTable.Rows)
MessageBox.Show(row[0] + "," + row[1] + "," + row[0]);
Dts.TaskResult = (int)ScriptResults.S
一样可以实现遍历的效果 -
最后一条记录-
通过讲解 Execute SQL Task 的两种查询结果返回方式 Single Row 和 Full Result Set,实际上由此引申出了何时使用 Single Row 以及 Full Result Set 的场景。熟悉和掌握这些场景可以帮助我们在复杂的 ETL 项目中找出各种不同的解决方案,可以非常灵活的解决一些实际问题。
再次,特别通过 Foreach Loop Container 以及 Script Task 学习到了两种解析 Full Result Set 的方式,其中涉及到的知识点以及细节还是比较多的,特意总结下来希望可以帮助到大家。
更多 BI 文章请参看&& 如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。您所在的位置: &
把XML数据插入到SQL Server数据库的表中
把XML数据插入到SQL Server数据库的表中
孙更新 肖冰 彭玉忠
清华大学出版社
《XML编程与应用教程》第6章 XML和Microsoft SQL Server的集成:Microsoft SQL Server 2005中可以应用XML技术方便地进行数据处理,本章将介绍Microsoft SQL Server 2005对XML的支持及其相互转换。本节说的是把XML数据插入到SQL Server数据库的表中。
6.3& 把XML数据插入到SQL Server数据库的表中
我们可以通过使用系统存储过程sp_xml_preparedocument的OPENXML函数把XML文档中的数据插入数据库中。其中,系统存储过程sp_xml_preparedocument用来创建一个能被插入数据库的XML文档的内部表示,该存储过程返回一个可以访问XML文档内部表示的句柄,另一方面,系统存储过程sp_xml_removedocument可以用来删除XML文档的内部表示。
系统存储过程sp_xml_preparedocument的语法如下:sp_xml_preparedocument&&handleddoc&&OUTPUT,xmltext&
●&handleddoc代表XML文档句柄的整数值。
●&xmltext代表原始的XML文档的文本值。
系统存储过程sp_xml_removedocument的语法如下:sp_xml_removedocument&&handleddoc&&&
handleddoc代表XML文档句柄的整数值。
上述这两个存储过程都可以使用函数OPENXML,函数OPENXML的语法如下:OPENXML(handleddoc,rowpattern,flagvalue) &With&tablename&
●&handleddoc代表XML文档句柄的整数值。
●&rowpattern代表来识别XML文档的节点XPath模式的可变长字符串的值。
●&flagvalue代表XML数据和相关的行集之间映射的整数值。如果值为1表示要对数据库中的字段做基于属性的映射;如果值为2表示要对数据库中的字段做基于元素的映射。
●&tablename代表数据库中的表名。
系统存储过程sp_xml_preparedocument读入XML文档内的文本并用MSXML解析器进行处理。处理以后,XML文档以带有元素、属性和文本的树型结构显示。OPENXML函数应用该树型结构并生成包含XML文档所有部分的行集。使用OPENXML和INSERT语句,即可以将行集中的数据插入到表中。下面通过实例进行讲解。
实例6-1& 以属性的形式将XML数据插入到SQL Server数据库的表中
(1) 在SQL Server查询分析器窗口中输入以下代码:USE&school &LECT&*&FROM&student&
运行后,先来查看插入之前student表中的数据,如图6-1所示。
(2) 重新输入以下代码:1&&USE&school &2&&DECLARE&@doc&varchar(1000) &3&&DECLARE&@idoc&int&4&&SET&@doc='&ROOT& &5&&&&&&&&&&&&student&id="5"&name="cathy"&6&&&&&&&&&&&&sex="female"&age="21"& &7&&&&&&&&&&&&&/student& &8&&&&&&&&&&&&&/ROOT&' &9&&exec&sp_xml_preparedocument&@idoc&output,@doc &10&&select&*&from&openxml(@idoc,'/ROOT/student',1) &11&&with(id&int,name&varchar(40),sex&varchar(20), &12&&&&&&&age&int) &13&&insert&student &14&&select&*&from&openxml(@idoc,'/ROOT/student') &15&&with&student &16&&exec&sp_xml_removedocument&@idoc&
在上面代码的第4~8行创建了一个变量@doc并把XML数据存放在该变量中。然后,第9行执行系统存储过程sp_xml_preparedocument,来创建一个能把数据插入数据库的XML文档内部表示,该系统存储过程返回一个保存在变量@idoc中的句柄,可以用该句柄访问XML文档的内部表示。第10行使用一个select语句访问XML文档的内部表示,并把该文档中的所有数据显示出来。
(3) 运行程序,结果如图6-2所示。
(4) 重新输入以下代码。USE&school &SELECT&*&FROM&student&
运行后,查看插入之后student表中的数据,如图6-3所示。
通过图6-3可以清楚地看到,XML数据已经被插入到了数据库中。
实例6-2& 以元素的形式将XML数据插入到SQL Server数据库的表中
接着上一个实例,我们继续进行数据的插入,不过这次是以元素的形式进行插入操作的。
首先在查询窗口中输入以下代码:1&&DECLARE&@doc&varchar(1000) &2&&DECLARE&@idoc&int&3&&SET&@doc='&ROOT& &4&&&&&&&&&&&&student&& &5&&&&&&&&&&&&id&6&/id& &6&&&&&&&&&&&&name&sun&/name& &7&&&&&&&&&&&&sex&male&/sex& &8&&&&&&&&&&&&age&24&/age& &9&&&&&&&&&&&&/student& &10&&&&&&&&&&&/ROOT&' &11&&exec&sp_xml_preparedocument&@idoc&output,@doc &12&&select&*&from&openxml(@idoc,'/ROOT/student',2) &13&&with(id&int,name&varchar(40),sex&varchar(20), &14&&&&&&&age&int) &15&&insert&student &16&&select&*&from&openxml(@idoc,'/ROOT/student',2) &17&&with&student &18&&exec&sp_xml_removedocument&@idoc&
在上面代码的第3~10行创建了一个变量@doc,并把XML数据存放在该变量中。然后,第11行执行系统存储过程sp_xml_preparedocument,来创建一个能把数据插入数据库的XML文档的内部表示,该系统存储过程返回一个保存在变量@idoc中的句柄,可以用该句柄访问XML文档的内部表示。第12行使用一个select语句访问XML文档的内部表示,并把该文档中的所有数据显示出来了。该段代码与实例6-1中代码的唯一区别就在于变量中存放的XML数据是以元素的形式出现的,而不是属性的形式。
运行程序,结果如图6-4所示。
重新输入以下代码:USE&school &SELECT&*&FROM&student&
运行后,查看插入之后student表中的数据,如图6-5所示。
可以清楚地看到,XML数据已经被插入到了数据库中。
通过上述实例可以看到,在SQL Server 2005 中,OPENXML的功能得到了增强,它可以将XML类型数据传递到sp_xml_preparedocument存储过程中,并且可以在WITH子句中使用新的数据类型。
【责任编辑: TEL:(010)】&&&&&&
关于&&&&的更多文章
在本专题中,您将学习如何构建通过Internet使用XML的Android应用
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
使用 iOS 6游戏开发入门经典(第2版) ,学习为iPhone 5
本书是一本系统讲解Android应用开发安全的书籍。它首
产品经理发展到一定阶段,再要成长,光靠学习一些知识
本书从基础知识入手,详细讨论了Oracle数据库的创建、OEM及iSQL*Plus等工具的使用、Oracle的字符集知识、用户的创建与管理、表空
51CTO旗下网站我从网上下载了一个ssh框架的例子,数据库的连接写在applicationContext.xml中,求高人指教,不胜感激!_百度知道
我从网上下载了一个ssh框架的例子,数据库的连接写在applicationContext.xml中,求高人指教,不胜感激!
struts、spring、hibernate的类包已经导入到web-INF下的lib文件夹中,我用的是SQL Server 2005数据库,数据库驱动包也导入到lib目录下。用ssh框架连接sql server 2005的数据库,是不是要打开1433的端口?如何打开?麻烦帮我解释下下面的代码。小弟刚入门,望好心人指教!&beans& &!-- 数据库连接的取得 --& &bean id=&dataSource&
class=&org.springframework.jdbc.datasource.DriverManagerDataSource&&
&property name=&driverClassName&&
&value&com.microsoft.sqlserver.jdbc.SQLServerDriver&/value&
&/property&
&property name=&url&&
&value&jdbc:sqlserver://localhost:1433;DatabaseName=db_personManager&/value&
&/property&
&property name=&username&&
&value&sa&/value&
&/property&
&property name=&password&&
&value&sa&/value&
&/property& &/bean& &!-- Spring支持Hibernate框架的配置,得到SessionFactory--& &bean id=&localSessionFactory&
class=&org.springframework.orm.hibernate3.LocalSessionFactoryBean&&
&property name=&dataSource&&
&ref bean=&dataSource& /&
&/property&
&property name=&hibernateProperties&&
&prop key=&hibernate.dialect&&
org.hibernate.dialect.SQLServerDialect
&/prop&
&/props&
&/property&
&property name=&mappingResources&&
&value&com/wy/form/ManagerForm.hbm.xml&/value&
&value&com/wy/form/DepartmentForm.hbm.xml&/value&
&value&com/wy/form/InviteJopForm.hbm.xml&/value&
&value&com/wy/form/EmployeeForm.hbm.xml&/value&
&value&com/wy/form/PayForm.hbm.xml&/value&
&value&com/wy/form/TrainForm.hbm.xml&/value&
&value&com/wy/form/CjForm.hbm.xml&/value&
&/list&
&/property& &/bean&
&bean id=&objectDao& class=&com.wy.dao.ObjectDao&&
&property name=&sessionFactory&&
&ref bean=&localSessionFactory& /&
&/property& &/bean&
提问者采纳
首先配置sqlserver的数据库。端口号为1433;这样程序才能正确的连接到数据库中。&datasource&是数据源。负责注册到 数据库中。包括数据库的登录密码用户名。&sessionfactroy&是Hibernate提供可以说是一个接口吧。在spring的配置文件中实例化并加载。里面配置有数据库的方言,&prop key=&hibernate.dialect&& org.hibernate.dialect.SQLServerDialect&/prop&,还可以配置是否显示sql语句&prop key=&hibernate.show_sql&&true&/prop&,然后加载一些对象与数据库字段映射的配置文件。&property name=&mappingResources&&里面value里写的xx.hbm.xml文件。
提问者评价
谢谢你详细的回答,也谢谢其他几位的回答。我已经搞定了。
其他类似问题
为您推荐:
其他3条回答
朋友,你的ssh都学习完成了没,学习完成了的话,ssh的整合的核心配置,有spring处理,否则的话,先把ssh每一个学习完成了,看看视频或者老师的讲解就明白了
给你个建议。你通过Eclipse自带的连接工具测试连接成功之后可自动生成该配置文件中对datasource和sessionFactory的配置。你的JDBC如果连接失败的话你怎么配置都是木用的了
ssh框架的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁如何从数据库表中生成xml文件?_百度知道
如何从数据库表中生成xml文件?
有一个树形结构,存储在数据库中,用的是sql server 2000的数据库。存的数据表中有5列,第一列为id,即一个以1为种子的递增序列;第二列为节点编号,用于表示树形节点中的值;第三列为父节点编号;第四列为节点名称,用于表示树形节点中显示的文字;第五列为节点层数。现在,要将从该数据表产生一个xml文件,这个文件可以直接绑定到树形控件从而来生成这颗树。请问,这个生成xml文件的c#程序代码怎么写啊?有一个方法是用xmltextwriter的方法做的,但是却总是提示没有根节点。还有一种是用xmldocment的方法做的,但是,在写的过程中,关于xmlnode和xmlelement之间无法转化,也没办法写下去。有没有哪位高手大哥能告诉小弟怎么写啊?如果解决的话,还会追加分数,谢谢拉,在线急等!
有没有简单的答案啊?要针对性强的。这么长的代码,是要看死人的。呵呵。非典型性天秤座这位仁兄着实厚道。不过小弟我已经解决了这个问题。不是用仁兄的方法做的。因为这样做会有一个很大的问题,就是循环次数过多,速度会很慢了。小弟刚刚用了强制转换,还是用xmldocument方法实现的。呵呵,只用了一次遍历数据表就直接生成了。
提问者采纳
对于楼主这个问题,如果还是多重节点的话会很麻烦.首先从最基本的开始吧:using System.X引入Xml命名空间,然后建立一个XML文档.XmlTextWriter writer = new XmlTextWriter(&tree.xml&, System.Text.Encoding.UTF8);建立根节点:writer.WriteStartDocument();writer.WriteStartElement(&tree&);writer.WriteEndElement();writer.WriteEndDocument();这样就建立了&tree&根节点.接着开始读数据,首先提取节点字段为最高层的所有记录.并填充到数据集中,然后用循环writer.WriteStartDocument();writer.WriteStartElement(&tree&);for(int r=0;r&ds.Tables[0].Rows.Cr++){//在这里面添加&tree&的子节点writer.WriteStartElement(ds.Tables[0].Row[r][节点名称].ToString());writer.WriteStartString(节点元素标签中间的文字);writer.WriteEndElement();}writer.WriteEndElement();writer.WriteEndDocument();以上就可以写出第一层节点的内容了.然后依次提取第二层的,注意是属于哪一个父节点的第二层,就添至哪个节点下.添至某个节点下的新节点的方法XmlDocument document = new XmlDocument();document.Load(&tree.xml&);XmlNodeList list= document.GetElementsByTagName(节点名称);获得为此标签名的节点集合.然后建立一个XmlNode对象,用list.AppendChildNode()方法增加这个子XmlNode.这个子XmlNode就是子节点...具体的方法暂时我也不太清楚了,不好意思.只能奉献这么多了...这乱就乱在每个子节点都要去判断是第几层节点,父节点是谁,如果节点层次太深,弄个4,5层的还好,再搞个节点数量是动态添加的...估计累死我也弄不出来了,不知道有没高人有更好的办法.
提问者评价
呵呵,谢谢这位大哥。你的这个方法,说实话,的确是馊主意。不过还是谢谢这位大哥!以后多多交流。
其他类似问题
1人觉得有用
为您推荐:
其他2条回答
public class Board
private XmlDocument domNav = new XmlDocument();
private XmlN
public Board()
domNav.LoadXml(&&Root id=\&0\&/&&);
root = domNav.DocumentE
public string GetXMLString(int boardId)
if (boardId & 0)
boardId = 0;
SqlParameter[] prams = { DBAdapter.MakeInParam(&@SubRootID&, SqlDbType.Int, 4, boardId) };
DataSet ds =
DBAdapter.RunProc(&F_GetBoardTree&, prams, out ds);
foreach (DataRow myRow in ds.Tables[0].Rows)
AppendNode(myRow[&ParentID&].ToString(), myRow[&BoardID&].ToString()...
读XML的速度没有读数据库快
下面的是discuz中的的方法,你看看行不行
public abstract class XMLComponent
//源数据表
private DataTable sourceDT =
public DataTable SourceDataTable
set{sourceDT =}
get{return sourceDT;}
//文件输出路径
private string fileOutputPath = @&&;
public string FileOutPath
//保证路径字符串变量的合法性
if (value.LastIndexOf(&\\&) != (value.Length-1))
fileOutputPath = value + &\\&;
get{return fileOutputP}
//文件编码
private string fileEncode = &utf-8&;
public string FileEncode
set{fileEncode =}
get{retur...
参考资料:
nt.discuz.net
您可能关注的推广回答者:
xml文件的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁版权所有 京ICP备号-2
迷上了代码!

我要回帖

更多关于 sql row number 的文章

 

随机推荐