T SQL导出为XML

时间:2019-03-08 09:11:07

标签: sql sql-server xml

我正在使用MS SQL Server 2016 SP2。

我有一个包含两列的表格:

Filename                      XML
---------                     --------------------
c:\myfolder\test.xml          <?xml version blah blah blah 
c:\myfolder\test2.xml         <?xml version blah blah blah
c:\myfolder\test3.xml         <?xml version blah blah blah

使用SQL,我想导出XML列中的XML并从Filename列中创建文件。我尝试使用游标和BCP,如下所示,但我不断收到消息:

  

复制方向必须为“输入”,“输出”或“格式”。用法:bcp {dbtable |查询}出|查询输出格式}数据文件

这是我的SQL-我在哪里出错?

感谢您的帮助。

  DECLARE @name VARCHAR(MAX)
  DECLARE db_cursor CURSOR FOR
      SELECT [Filename] FROM Instances

  OPEN db_cursor

  FETCH NEXT FROM db_cursor INTO @NAME

  WHILE @@FETCH_STATUS = 0
  BEGIN
      EXEC xp_cmdshell 'bcp -S xxxxxxx -d xxxxxxxxx "SELECT [XML] FROM Instances WHERE [Filename] = @NAME" -o @NAME -T -c -t -x'

      FETCH NEXT FROM db_cursor INTO @NAME
  END

 CLOSE db_cursor
 DEALLOCATE db_cursor

1 个答案:

答案 0 :(得分:2)

  

复制方向必须为“输入”,“输出”或“格式”。用法:bcp   {dbtable |查询}出|查询输出格式}数据文件

原因:

  • 缺少queryout
  • 在BCP之后立即声明源查询,并在查询之后列出其他开关
  • 此外,原始代码将@Name变量错误地注入了动态sql。

调整后的xp_cmdshell命令:

EXEC xp_cmdshell 'bcp "SELECT CAST([XML] as XML) FROM Instances WHERE [Filename] = '+@NAME+'"  queryout "'+@NAME+'" -S"xxxxxxx" -d"xxxxxxxxx" -c -T'

如果传出文件预期位于UNICODE中,则可以添加以下额外的开关:-w