【问题标题】:How to extract select statement into table field as XML如何将选择语句作为 XML 提取到表字段中
【发布时间】:2019-01-07 08:48:03
【问题描述】:

我正在尝试复制在 Oracle 数据库上工作的一段 sql 代码,以便在 SQL Server 中也能工作。基本上,我需要从多个表中选择某些列(定义)到一个表中——它就像一个只有可变数量表的联合。表的确切名称在 Oracle 中没有定义,我使用 user_tables like '%ABC%' 来获取所有表的列表,并使用 dbms_xmlgen.getxmltype 来执行创建的 select 语句。

在 Oracle 中,我有以下正在运行的代码...

select table_name,                  
   dbms_xmlgen.getxmltype('select id,name from '|| table_name).extract('/*') rec
from user_tables
where table_name like '%ABC%';

我知道我可以创建一个变量并将其执行到表中,但我需要它是一个 SELECT 语句,就像 oracle 一样。在 SQL Server 中可以实现类似的功能吗?

更新:我想要通用 SQL 语句的“执行”结果 => 输出有两列,table_name 作为第一列,第二列 (REC) 包含每个表的选择结果的 XML 块。

Desired Output Sample

【问题讨论】:

  • 示例 XML 和预期结果会很好。

标签: sql-server xml oracle


【解决方案1】:

您可以通过从sys.objects动态管理视图中选择来获取表列表,其中type列等于U(即用户表):

select name as TableName, 'select id, objectname, description from ' + name as SelectStatement
from sys.objects o
where o.type = 'U'
  and o.name like '%ABC%'

【讨论】:

  • 嗨 - 这只给我生成的选择语句文本 - 我需要选择语句的结果作为每行/表的 XML 块。
  • 您必须使用sp_executesqlexec 执行此操作。要获取 XML 格式的数据,您需要在 select 语句中添加 FOR XML 子句。
  • 所以没有像 Oracle 这样的选项可以将所有内容都放在一个 select 语句中?
【解决方案2】:

如果您想以 XML 格式获取表的内容,则需要生成动态 SQL 并执行此语句。使用来自sys.objects 系统目录视图的信息(如@AndreyNikolov 建议的那样)并使用FOR XML 子句检索每个表内容。

-- Declarations
DECLARE 
    @stm nvarchar(max),
    @err int

-- Statement generation
SET @stm = N''
SELECT @stm = @stm +
        N' UNION ALL ' +
        N'SELECT ' +
        N'''' +
        [name] + 
        N''' AS [Table], ' +
        N'(SELECT [id], [name] FROM '+
        + [name] +
        N' FOR XML RAW, ELEMENTS, TYPE, ROOT(''ROWSET'')) AS [Rec]'
FROM sys.objects
WHERE 
    ([type] = 'U') AND
    ([name] LIKE '%ABC%')
SET @stm = STUFF(@stm, 1, 10, N'')

-- Execution
PRINT @stm
EXEC @err = sp_executesql @stm
IF @err = 0 
    PRINT 'OK'
ELSE 
    PRINT 'Error'

【讨论】:

  • 谢谢你 - 但那是创建一个动态 sql 并执行它。我正在寻找一种直接在 select 语句中执行此操作的解决方案 - 与 oracle 部分相同。
猜你喜欢
  • 1970-01-01
  • 2013-11-20
  • 2021-03-26
  • 2010-10-03
  • 2020-10-16
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多