1

在我的数据库 ( GoogleSEOData) 中,我有一个表 (GoogleMarkupList),表中有以下示例数据:

PUBLICATION_ID  |   PAGEID  |   URL
-------------------------------------------------------------
233             |   654345  |   /english/index.aspx
345             |   654345  |   /de/english/index.aspx
432             |   654345  |   /ru/russian/index.aspx
533             |   654345  |   /ae/arabic/index.aspx
233             |   452323  |   /english/offers.aspx
345             |   452323  |   /de/english/offers.aspx
432             |   452323  |   /ru/russian/offers.aspx
533             |   452323  |   /ae/arabic/offers.aspx
233             |   834343  |   /english/destinations.aspx
345             |   834343  |   /de/english/destinations.aspx
432             |   834343  |   /ru/russian/destinations.aspx
533             |   834343  |   /ae/arabic/destinations.aspx

现在我想编写 SQL 过程,它将服务器的文件路径作为输入(D://GoogleMarkup),并在服务器上创建以下类型的 XML 文件(对于上述示例数据)。

654345 类型数据的 XML 文件的名称将是654345.XML

<ps>
<p n="233" u="/english/index.aspx" />
<p n="345" u="/de/english/index.aspx" />
<p n="432" u="/ru/russian/index.aspx" />
<p n="533" u="/ae/arabic/index.aspx" />
</ps>

452323 类型数据的 XML 文件的名称将是452323.XML

<ps>
<p n="233" u="/english/offers.aspx" />
<p n="345" u="/de/english/offers.aspx" />
<p n="432" u="/ru/russian/offers.aspx" />
<p n="533" u="/ae/arabic/offers.aspx" />
</ps>

834343 类型数据的 XML 文件的名称将是834343.XML

<ps>
<p n="233" u="/english/destinations.aspx" />
<p n="345" u="/de/english/destinations.aspx" />
<p n="432" u="/ru/russian/destinations.aspx" />
<p n="533" u="/ae/arabic/destinations.aspx" />
</ps>

我知道有实用性

SQLCMD -S Server -d Database -E -v pageid=%pid% 
       -Q "Select publication_id as [n], url  from table as [p] where pageid=$(pageid) for xml auto, root('ps')" 
       -o D://GoogleMarkup/%pid%.xml

但是如何一次创建所有的XML,以便它会一个一个地读取pageid并传递SQLCMD给创建XML,我是否需要为此编写游标,请提供一些好的代码示例。

请推荐!!

4

1 回答 1

3

您可以创建一个SP来循环并重复该命令以创建XML文件

重要提示: sqlcmd 实用程序需要:XML ON sqlcmd 命令在单行上

如果没有:XML ONsqlcmd 命令,结果如下:

XML_F52E2B61-18A1-11d1-B105-00805F49916B
---------------------------------------------------
0x440249004400440546006C006F00610074004408440061007...

(1 rows affected)

这就是为什么我们不能使用内联 sql 查询使用 sqlcmd 将数据导出到 xml 的原因。

但是我们可以使用该bcp实用程序进行内联 sql 查询。

CREATE PROCEDURE [dbo].[DO_XML]
AS 

Declare @PAGEID int
, @PAGEID_TEXT varchar(100)
, @CMD varchar(2000)
, @FILE varchar(100)

-- local cursor to cycle
DECLARE cXML CURSOR LOCAL FAST_FORWARD FOR
SELECT  PAGEID from GoogleMarkupList with (NOLOCK) group by PAGEID  

OPEN cXML

    FETCH NEXT FROM cXML INTO @PAGEID
    WHILE @@FETCH_STATUS = 0

    BEGIN
        set @PAGEID_TEXT = cast(@PAGEID as varchar(100))

        -- dynamic command to create XML
        -- MUST BE ALL IN 1 LINE
        set @CMD = 'bcp "Select publication_id as [n], url  from GoogleSEOData.dbo.GoogleMarkupList as [p] where pageid='+ @PAGEID_TEXT +' FOR XML AUTO, ELEMENTS, ROOT(''ps'')"  queryout E:\GoogleMarkup\'+@PAGEID_TEXT+'.XML -S MANOJ-PC\KRISH -T -c'

        -- do it
        exec master..xp_cmdshell @CMD, no_output

        FETCH NEXT FROM cXML INTO @PAGEID

END    
CLOSE cXML
DEALLOCATE cXML

此 SP 已通过创建所有 XML 文件进行测试并正常工作

添加命令行呢?

这里的例子:

bcp "Select publication_id as [n], url  from GoogleSEOData.dbo.GoogleMarkupList as [p] where pageid=452323 FOR XML AUTO, ELEMENTS, ROOT('ps')" queryout E:\GoogleMarkup\452323.xml -S GoogleSEOData -T -c

有关详细信息: 使用 bcp/sqlcmd 实用程序和 XML 导出 SQL Server

希望有帮助

于 2012-05-26T11:23:51.457 回答