【发布时间】:2016-04-29 08:01:17
【问题描述】:
我正在运行一个存储过程,它生成一个 XML 列,我想将其保存为来自 sqlcmd 的 XML 文件。
我遇到的问题是 XML 的格式不正确,例如,如果 XML 元素中有很多信息,它将在所有信息进入元素之前被切断。
另一个问题是整个 XML 文件本身还不够长。我有大约 26000 行需要放入 XML 文件中,而我正在运行的文件中只有大约 600 行。
这是我正在运行的存储过程:
CREATE PROCEDURE usp_MyProc
AS
;WITH XMLNAMESPACES( 'Products' AS p )
SELECT
ProductID
, ProductName
, Photo
, Price
, Attribute1 AS [p:attribute/@name]
, ISNULL( p.Attribute1Value, '' ) AS [p:attribute]
, ''
, Attribute2 AS [p:attribute/@name]
, ISNULL( Attribute2Value, '' ) AS [p:attribute]
, ''
, Attribute3 AS [p:attribute/@name]
, ISNULL( Attribute3Value, '' ) AS [p:attribute]
, ''
, Attribute4 AS [p:attribute/@name]
, ISNULL( Attribute4Value, '' ) AS [p:attribute]
, ''
FROM MyDatabase.dbo.MyTable
FOR XML PATH( 'Item' ), ROOT( 'Products' )
这是我从命令提示符运行的 SQLCMD:
sqlcmd -S "MyServer" -d "MyDatabase" -E -Q "EXEC usp_MyProc" -o "C:\temp\Test.xml" -W
我在几个地方读到 :XML ON 会解决这个问题,但我已将它放在存储过程和 SQLCMD 中,但它无法识别它。
感谢任何帮助。
【问题讨论】:
-
暂时没时间测试这个,但总的来说: 1) 纯阅读不应该用SP来做,尝试创建一个返回XML的标量函数并用
SELECT dbo.MyFunction()调用它。 2)您使用的是命名空间“p:”我怀疑如果没有WITH XMLNAMESPACES,这将起作用。 3)在,ROOT()后面设置,TYPE可能会有所帮助 -
我正在使用 WITH XMLNAMESPACES,我只是忘记将它复制到这里,我将编辑并放入它。我也会尝试你的建议。谢谢
标签: sql-server xml stored-procedures sqlcmd