SQL Server - 使用正则表达式导出数据?

时间:2012-04-19 19:35:36

标签: html sql sql-server regex

我有一个表,我正试图从SQL Server数据库中导出。其中一列让我很难,导入和导出向导会抛出各种错误。一旦删除此列,导出就会完美运行。

数据库中的列将完整的HTML文档存储为文本数据类型。我想在没有HTML的情况下在DIV标签之间仅导出此列中每个字段的文本。

例如:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
    <STYLE type=text/css> P, UL, OL, DL, DIR, MENU, PRE { margin: 0 auto;}</STYLE>
    <META content="MSHTML 6.00.2900.3429" name=GENERATOR>
</HEAD>
<BODY leftMargin=1 topMargin=1 rightMargin=1>
    <FONT face=Tahoma size=2>
        <DIV>[REDACTED TEXT THAT I WANT TO EXPORT]</DIV>
    </FONT>
</BODY>
</HTML>

这是从其中一条记录中粘贴的副本。每行在记录中都有相同的HTML,但我只想导出编辑后的文本。

暂且不说设计这个数据库/应用程序的人是个白痴,我该如何获取这些数据?如果我能让导出向导工作,我甚至愿意用HTML来提取完整​​的记录。

编辑:以下是导入和导出向导报告错误:

  

操作停止......
   - 初始化数据流任务(成功)
   - 初始化连接(成功)
   - 设置SQL命令(成功)
   - 设置源连接(成功)
   - 设置目的地连接(成功)
   - 验证(成功)
   - 准备执行(成功)
   - 预执行(成功)
   - 执行(警告)
  消息
  *警告:准备SQL任务1:多步OLE DB操作生成错误。检查每个OLE DB状态值(如果可用)。没有工作。 (SQL Server导入和导出向导)
  *警告:准备SQL任务1:多步OLE DB操作生成错误。检查每个OLE DB状态值(如果可用)。没有   工作完成了。 (SQL Server导入和导出向导)

     
      
  • 复制到Query(错误)
      消息
  •   
  • 错误0xc0202009:数据流任务1:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x00040EDA。

  •   
  • 错误0xc0209029:数据流任务1:SSIS错误代码DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 “输入”目标输入“(45)”失败,因为出现错误代码0xC020907B,错误行   处理“输入”目的地输入“(45)”指定失败   错误。指定的指定对象发生错误   零件。在此之前可能会发布错误消息   有关失败的信息。

  •   
  • 错误0xc0047022:数据流任务1:SSIS错误代码DTS_E_PROCESSINPUTFAILED。组件上的ProcessInput方法   “目标 - 查询”(34)失败,错误代码为0xC0209029   处理输入“目的地输入”(45)。确定的组件   从ProcessInput方法返回错误。错误是特定的   到组件,但错误是致命的,将导致数据流   任务停止运行。在此之前可能会发布错误消息   有关失败的更多信息。

  •   
  • 错误0xc02020c4:数据流任务1:尝试向数据流任务缓冲区添加行失败,错误代码为0xC0047020。

  •   
  • 错误0xc0047038:数据流任务1:SSIS错误代码DTS_E_PRIMEOUTPUTFAILED。组件“Source

  • 上的PrimeOutput方法   
  • 查询“(1)返回错误代码0xC02020C4。当管道引擎调用PrimeOutput()时,组件返回失败代码。   失败代码的含义由组件定义,但错误   是致命的,管道停止执行。可能有错误   在此之前发布的消息以及有关失败的更多信息。

  •   
  • 执行后(成功)
      消息

  •   
  • 信息0x4004300b:数据流任务1:“组件”目的地 - 查询“(34)”写了7465行。
  •   

1 个答案:

答案 0 :(得分:0)

在该字段的select语句中,仅使用SUBSTRING和CHARINDEX提取所需的部分以剪切标记之间的部分,假设每个字段实际上只有一个这样的标记。下面,[HTML]实际上是你的字段转换为VARCHAR,所以在你看到[HTML]的时候你会把它放在:

CAST([YourHTMLFieldName] AS VARCHAR(MAX))

这基本上说“给我以及之间的文字:

SELECT SUBSTRING([HTML], CHARINDEX('<DIV>', [HTML]), CHARINDEX([HTML], '</DIV>') - CHARINDEX([HTML], '<DIV>'))

您可能需要稍微玩一下,比如输出错误地包含“”标签,您可以将其更改为“CHARINDEX('')+ 5”。