【问题标题】:Generate XML adding a custom value on a table's column生成 XML 在表的列上添加自定义值
【发布时间】:2014-04-04 11:29:44
【问题描述】:

我有这张桌子:

CREATE TABLE [dbo].[INCREMENTAL_TABLE](
    [GTIN] [bigint] NOT NULL,
    [PRESENTATION] [tinyint] NOT NULL,
    [LEVEL] [bigint] NOT NULL,
    [INCREMENTAL] [bigint] NOT NULL DEFAULT(0)
 CONSTRAINT [PK_INCREMENTAL_TABLE_1] PRIMARY KEY CLUSTERED 
(
    [GTIN] ASC,
    [PRESENTATION] ASC,
    [LEVEL] ASC
) ON [PRIMARY]

现在,我正在创建一个存储过程:

CREATE PROCEDURE MyProc
    @gint bigint,   
    @pres tinyint,
    @level bigint,
    @quantity smallint
AS

    DECLARE @current_incremental bigint
    DECLARE @counter bigint

    -- Get current incremental.
    set @current_incremental = 
        (SELECT INCREMENTAL
            FROM INCREMENTAL_TABLE
            WHERE GTIN = @gint AND
              PRESENTATION = @pres AND
              LEVEL = @level)

    -- 
    SET @counter = @current_incremental
    WHILE ((@counter - @current_incremental) <= @quantity)
        BEGIN

            SET @counter = @counter + 1
        END


GO

在这个存储过程中,我必须创建一个带有 @quantity 节点的 XML。想象一下我有这个电话:

EXEC MyProc @gint = 1 @pres = 2 @level = 3 @quantity = 100

而且,我有这个初始值:

@current_incremental = 10

有了这些数据,我必须返回一个带有这些值的 xml:

GTIN | PRESENTATION | LEVEL | INCREMENTAL
-----+--------------+-------+------------
  1  |       2      |   3   |    10
-----+--------------+-------+------------
  1  |       2      |   3   |    11
-----+--------------+-------+------------
  1  |       2      |   3   |    12

[ ... ]
-----+--------------+-------+------------
  1  |       2      |   3   |    109

但我不会将它插入到表格中。

如果我无法通过对该表的选择来获取包含这些数据的 XML?

【问题讨论】:

    标签: sql xml sql-server-2012


    【解决方案1】:

    您可以使用数字表格或其他包含足够行数的表格。

    declare @gint int = 1;
    declare @pres int = 2;
    declare @level int = 3;
    declare @quantity int = 100;
    declare @current_incremental int = 10;
    
    with Numbers as
    (
      select row_number() over(order by 1/0) as N
      from sys.all_objects as o1 cross join
           sys.all_objects as o2
    )
    select @gint as GINT,
           @pres as PRESENTATION,
           @level as LEVEL,
           N as INCREMENTAL
    from Numbers
    where N >= @current_incremental and
          N < @current_incremental + @quantity
    for xml path('row'), root('root'), type
    

    结果:

    <root>
      <row>
        <GINT>1</GINT>
        <PRESENTATION>2</PRESENTATION>
        <LEVEL>3</LEVEL>
        <INCREMENTAL>10</INCREMENTAL>
      </row>
      <row>
        <GINT>1</GINT>
        <PRESENTATION>2</PRESENTATION>
        <LEVEL>3</LEVEL>
        <INCREMENTAL>11</INCREMENTAL>
      </row>
      .
      .
      .
      .
      <row>
        <GINT>1</GINT>
        <PRESENTATION>2</PRESENTATION>
        <LEVEL>3</LEVEL>
        <INCREMENTAL>108</INCREMENTAL>
      </row>
      <row>
        <GINT>1</GINT>
        <PRESENTATION>2</PRESENTATION>
        <LEVEL>3</LEVEL>
        <INCREMENTAL>109</INCREMENTAL>
      </row>
    </root>
    

    【讨论】:

    • 感谢您的回答。我有一个问题:Numbers 是什么?是数字表吗?
    • @VansFannel Numbers 在我的回答中是一个 CTE,而不是一个数字表。 CTE 使用两个相当大的表之间的交叉连接来提供足够的行。如果您不想使用 CTE,您可以创建自己的数字表,其中只有一列从 1(或 0)编号到您需要的行数。
    • @VansFannel 有关数字表的更多信息here
    • 如果我使用declare @current_incremental bigint = 2000000; 它不起作用。 @quantity 是我需要的行数。 INCREMENTAL 将具有以下值:从 2000000 到 2000099。
    • @VansFennel 我看到你已经弄清楚了。你只需要对数字有所不同。
    【解决方案2】:

    我已经修改了Mikael Eriksson 的answer 以满足我的需要:

    declare @gint bigint = 1;
    declare @pres tinyint = 2;
    declare @level bigint = 3;
    declare @quantity smallint = 100;
    declare @current_incremental bigint = 20000000;
    
    with Numbers as
    (
      select row_number() over(order by 1/0) as N
      from sys.all_objects as o1 cross join
           sys.all_objects as o2
    )
    select @gint as GINT,
           @pres as PRESENTATION,
           @level as LEVEL,
           N + @current_incremental as INCREMENTAL
    from Numbers
    where N < @quantity
    for xml path('row'), root('root'), type
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多