【问题标题】:Convert SQL code that uses XML/XPath to VBScript (classic ASP)将使用 XML/XPath 的 SQL 代码转换为 VBScript(经典 ASP)
【发布时间】:2009-06-16 16:54:40
【问题描述】:

我想将下面的 SQL Server 代码转换为经典 ASP 中的 VBScript...

DECLARE @idoc int
DECLARE @xdoc nvarchar(4000)
DECLARE @xmldoc xml
Set @xmldoc = '<Root><Authors au_id="409-56-7008" au_lname="Bennet" au_fname="Abraham"><Titles title="The Busy Executive&apos;s Database Guide"/></Authors><Authors au_id="648-92-1872" au_lname="Blotchet-Halls" au_fname="Reginald"><Titles title="Fifty Years in Buckingham Palace Kitchens"/></Authors><Authors au_id="238-95-7766" au_lname="Carson" au_fname="Cheryl"><Titles title="But Is It User Friendly"/></Authors><Authors au_id="722-51-5454" au_lname="DeFrance" au_fname="Michel"><Titles title="The Gourmet Microwave"/></Authors><Authors au_id="712-45-1867" au_lname="del Castillo" au_fname="Innes"><Titles title="Silicon Valley Gastronomic Treats"/></Authors><Authors au_id="427-17-2319" au_lname="Dull" au_fname="Ann"><Titles title="Secrets of Silicon Valley"/></Authors><Authors au_id="267-41-2394" au_lname="Ellis" au_fname="Michael"><Titles title="Cooking with Computers: Surreptitious Balance Sheets"/><Titles title="Sushi for Anyone"/></Authors><Authors au_id="213-46-8915" au_lname="Green" au_fname="Marjorie"><Titles title="The Busy Executive&apos;s Database Guide"/><Titles title="You Can Combat Computer Stress"/></Authors></Root>' 

SELECT 
 Authors.value('./@au_id', 'varchar(20)') as au_id,
 Authors.value('./@au_fname', 'varchar(20)') as au_fname,
 Authors.value('./@au_lname', 'varchar(20)') as au_lname,
 Authors.value('Titles[1]/@title', 'varchar(20)') as Title
FROM 
@xmldoc.nodes('/Root/Authors') as TableValues(Authors)

如何用经典的 ASP (VBScript) 编写上述代码?

你能帮我解决这个问题吗?

【问题讨论】:

    标签: sql xml asp-classic vbscript


    【解决方案1】:
    <%
    
    Dim xmldoc
    Set xmldoc = Server.CreateObject("MSXML2.DOMDocument.4.0")
    
    xmldoc.SetProperty "SelectionLanguage", "XPath"
    ''# note the escaped double quotes
    xmldoc.LoadXml "<Root><Authors au_id=""409-56-7008"" au_lname=""Bennet"" au_fname=""Abraham""><Titles title=""The Busy Executive&apos;s Database Guide""/></Authors><Authors au_id=""648-92-1872"" au_lname=""Blotchet-Halls"" au_fname=""Reginald""><Titles title=""Fifty Years in Buckingham Palace Kitchens""/></Authors><Authors au_id=""238-95-7766"" au_lname=""Carson"" au_fname=""Cheryl""><Titles title=""But Is It User Friendly""/></Authors><Authors au_id=""722-51-5454"" au_lname=""DeFrance"" au_fname=""Michel""><Titles title=""The Gourmet Microwave""/></Authors><Authors au_id=""712-45-1867"" au_lname=""del Castillo"" au_fname=""Innes""><Titles title=""Silicon Valley Gastronomic Treats""/></Authors><Authors au_id=""427-17-2319"" au_lname=""Dull"" au_fname=""Ann""><Titles title=""Secrets of Silicon Valley""/></Authors><Authors au_id=""267-41-2394"" au_lname=""Ellis"" au_fname=""Michael""><Titles title=""Cooking with Computers: Surreptitious Balance Sheets""/><Titles title=""Sushi for Anyone""/></Authors><Authors au_id=""213-46-8915"" au_lname=""Green"" au_fname=""Marjorie""><Titles title=""The Busy Executive&apos;s Database Guide""/><Titles title=""You Can Combat Computer Stress""/></Authors></Root>"
    
    Dim Author
    
    Response.Write "<table>" & vbNewLine
    For Each Author In xmldoc.SelectNodes("/Root/Authors")
      Response.Write "<tr>" & vbNewLine
      WriteTableCell Author.GetAttribute("au_id")
      WriteTableCell Author.GetAttribute("au_fname")
      WriteTableCell Author.GetAttribute("au_lname")
      WriteTableCell Author.SelectSingleNode("Titles[1]/@title")
      Response.Write "</tr>" & vbNewLine
    Next
    Response.Write "</table>" & vbNewLine
    
    ''# table cell output factored into a Sub, for reuse and cleaner code
    Sub WriteTableCell(xmldata)
      Dim s
    
      If IsObject(xmldata) Then
        If xmldata Is Nothing Then
          s = ""
        Else
          s = xmldata.text
        End If
      Else
        s = CStr(xmldata)
      End If
    
      Response.Write "<td>" & Server.HTMLEncode(s) & "</td>" & vbNewLine
    End Sub
    
    %>
    

    经过测试,有效。

    【讨论】:

    • +1。做得很好。几个建议。使用 MSXML3.DOMDocument.3.0(我遇到过由于安装错误的 MSXML2 导致不合格的 ProgID 返回 MSXML2 实现的机器,即使安装了 MSXML3)。第二个 s = "" 导致 TD 不渲染,一个不间断的空间应该可以解决问题 s = ChrW(8239)
    • 据我所知,没有“MSXML3”之类的东西。直到 6.0 的每个版本都在 ProgId 中使用“MSXML2”。 (msdn.microsoft.com/en-gb/library/ms764622.aspx)。我认为这只是你的一个错字。 :-) 我将把它改成使用 4.0,它应该被广泛部署和使用,对于手头的工作来说也绰绰有余了。关于 's = ""' - 单元格只是不显示,这很容易用 CSS 和 'empty-cells: show;' 修复在相当现代的浏览器中。此外,便携式 nbsp 是 Chr(160),恕我直言。
    • 哎呀是一种类型。 MSXML2.DOMDocument.3.0。我也会避免使用 4.0,原因有两个 a.) 虽然它被广泛部署,但不能保证它出现在所有当前支持的 Windows 服务器上 b.) MS 只积极维护 3.0(因为它是迄今为止使用最广泛的)和 6.0(因为它是 COM XML 行中的当前和最后一行)dll。
    • 是的 160 是更好的选择 我不记得那是 1252 特定代码点还是 unicode 代码点。 empty-cells 仅在 IE8 的 IE 中获得支持,因此目前可能不是公共站点的好选择。
    【解决方案2】:

    我建议将此逻辑封装到存储过程中。然后只需从您的经典 asp 页面调用此存储过程。您将花费太多时间将此逻辑从 SQL Server 的内置 XML 解析功能转换为 VBScript。 VBScript 没有一组丰富的功能来解析 xml 文档。

    使用最适合工作的工具。如果存在管理限制,或许可以尝试唤起某人的理智。我知道这并没有像您预期的那样回答您的具体问题。

     Create Procedure GetAuthors
    
    AS 
        DECLARE @idoc int ,
                @xdoc nvarchar(4000) ,
                @xmldoc xml 
    
        SELECT @xmldoc = ''
    
    
        SELECT Authors.value('./@au_id', 'varchar(20)') as au_id, 
        Authors.value('./@au_fname', 'varchar(20)') as au_fname, 
        Authors.value('./@au_lname', 'varchar(20)') as au_lname, 
        Authors.value('Titles[1]/@title', 'varchar(20)') as Title 
        FROM @xmldoc.nodes('/Root/Authors') as TableValues(Authors)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多