2016-05-22 58 views
0

當我有從存儲過程下面的BCP命令。該存儲過程的結構如下:T-SQL bcp語法問題輸出XML

SET @sqlCmd = 'bcp "' + @sqlStr + '" queryout "' + @offersFilename + '" -w -T'; 

EXEC xp_cmdshell @sqlCmd; 

當我嘗試運行此,我得到的BCP使用響應,這意味着在我@sqlCmd一些語法錯誤。

使用打印@sqlCMD,我得到下面的打印輸出。有人可以請告訴我哪裏錯了。謝謝。

bcp "select custID as ""@id"", 
     (
      SELECT familyDesc as ""familyDesc"", 
       upc as ""upc"", 
       itemDesc as ""itemDescription"", 
       offerCode as ""offerCode"", 
       offerDesc as ""offerDesc"", 
       validFrom as ""validFrom"", 
       validTo as ""validTo"", 
       cast(round(price,2) as decimal(19,2)) as ""price"", 
       imageURL as ""imageURL"" 
      FROM tblCustomerOffers t2 where t1.custID=t2.custID 
      for XML PATH('Offer'), TYPE 
     ) 
     from tblCustomerOffers t1 
     group by custID 
     FOR XML PATH('Customer'), ROOT ('Offers'), ELEMENTS" 
queryout "D:\offers\customerOffers.xml" -w -T 

回答

2

我在工作中遇到過類似的問題。

的一種方式,使調試更容易些會,而不是使用BCP的queryout命令,創建一個全球臨時表來存儲您的查詢的結果。然後使用bcp的輸出命令導出該單個記錄。

例如,

CREATE TABLE ##FooResults (result XML) 
INSERT INTO ##FooResults 
SELECT (
    SELECT Bar AS [Bar] 
    FROM Foo 
    FOR XML PATH('Foo') 
) 

DECLARE @ExportXmlCommand VARCHAR(4000) = 'bcp ##FooResults out "C:\foo.xml" -w -T' 
EXEC xp_cmdshell @ExportXmlCommand 

DROP TABLE ##FooResults 

這樣做的好處是,它可以讓你利用SSMS的語法高亮顯示,並提供一個錯誤的情況下,更詳細的結果。


缺點是所有的XML都被壓扁成單行。

爲了解決這個問題,我已經通過運行PowerShell腳本,將重新格式化XML,以便它的可讀性想出了一個解決方法。

Param(
    [string]$infile, 
    [string]$outfile, 
    [int]$indent = 4 
) 

function Format-XML { 
    Param(
     [xml]$xml, 
     [int]$indent = 4 
    ) 
    $StringWriter = New-Object System.IO.StringWriter 
    $XmlWriter = New-Object System.XMl.XmlTextWriter $StringWriter 
    $xmlWriter.Formatting = "indented" 
    $xmlWriter.Indentation = $indent 
    $xml.WriteContentTo($XmlWriter) 
    $XmlWriter.Flush() 
    $StringWriter.Flush() 
    Write-Output $StringWriter.ToString() 
} 

$result = Format-XML ([System.Xml.XmlDocument](cat (Resolve-Path $infile))) $indent 
$result | Set-Content "$outfile" 

(改編自https://blogs.msdn.microsoft.com/powershell/2008/01/18/format-xml/


所以把他們放在一起,最後幾行最終看起來像這樣:

DECLARE @ExportXmlCommand VARCHAR(4000) = 'bcp ##FooResults out "C:\foo.temp.xml" -w -T' 
DECLARE @FormatXmlCommand VARCHAR(4000) = 'PowerShell.exe -ExecutionPolicy Bypass -File "C:\Format-Xml.ps1" "C:\foo.temp.xml" "C:\foo.xml"' 
DECLARE @DeleteTempXmlCommand VARCHAR(4000) = 'del "C:\foo.temp.xml"' 

EXEC xp_cmdshell @ExportXmlCommand 
EXEC xp_cmdshell @FormatXmlCommand 
EXEC xp_cmdshell @DeleteTempXmlCommand 

我希望這可以幫助你找到原因的錯誤!

埃裏克

+0

非常感謝@Eric波特,這種解決方法(全球溫度和PowerShell腳本)是,我可以在此期間實現至少自動化的全過程的最佳解決方案。這很奇怪,因爲在DOS提示符下輸入上面打印的整個bcp命令可以很好地工作 - 但是將其包裝在存儲過程中並且所有地獄都打破了。非常感謝! – Ceasar