使用sp_MSforeachtable导出到XML时的动态表名

时间:2016-10-04 10:24:00

标签: sql-server xml

我正在尝试使用sp_MSforeachtable子句将我的一些SQL Server表数据导出到XML。我可以在一定程度上取得成功,但坚持添加TableName&表标题作为层次结构的子项。

到目前为止我做了什么,

DECLARE @TableNames nvarchar(max)
SELECT
  @TableNames = STUFF((SELECT
    ',OBJECT_ID(''' + CONVERT(nvarchar(20), Name) + ''')'
  FROM Sys.Tables
  WHERE Name ='TableCustomers'
  FOR xml PATH (''))
  , 1
  , 1
  , '')
Print @TableNames

我得到输出为

  

OBJECT_ID(' TableCustomers&#39)

有了这个,我正在运行另一个查询,

DECLARE @QueryForXMLs AS varchar(1000)
SET @QueryForXMLs = 'IF OBJECT_ID(''?'')  IN (' + @TableNames + ')
                        Select * FROM ? FOR XML PATH(''Customer''), Root(''Customers'')'

Print @QueryForXMLs

EXEC sp_MSforeachtable @QueryForXMLs 

有了这个,我得到了输出,

<Customers>
  <Customer>
    <Id>2</Id>
    <CID>CU1</CID>
    <Name>CuName</Name>
    <Status>Active</Status>
  </Customer>
</Customers>

如果我有一行作为第一个查询的输出,这可以正常工作。但是,如果第一个查询(WHERE Name Like'Table%'而不是WHERE Name ='TableCustomers')有多行,我会获得Root&amp; Root子名称为硬编码。

为了使用sp_MSforeachtable

获取每个表执行的动态表名和动态子名,我将采取什么措施?

我尝试了以下方法,但由于表名与模式名称

一起出现,因此无法成功
SET @QueryForXMLs = 'IF OBJECT_ID(''?'')  IN (' + @TableNames + ')
                        Select * FROM ? FOR XML PATH(''Row''), Root(''?'')'

0 个答案:

没有答案