【问题标题】:How Stuff Works Or Logic of Stuff & XML Path in SQLSQL 中 Stuff 的工作原理或 Stuff 和 XML 路径的逻辑
【发布时间】:2014-09-20 12:30:29
【问题描述】:

我的输出是正确的,但我想知道 STUFF 是如何工作的。

我有一个简单的查询,它返回 @startDate@endDate 之间的总月数。

我在 STUFF 的帮助下将那几个月存储到 @cols 中。

查询是这样的:

SELECT DISTINCT ',' 
                + Quotename(CONVERT(CHAR(10), startdate, 120)) 
FROM   #tempdates 
    查询中的
  1. "," 应在值之前打印,但打印如下 O/P。
  2. 如果我从我得到空值的东西中删除 XML 路径。
  3. STUFF 如何与 XML 路径一起工作

这是我的输出:

 DECLARE @cols AS NVARCHAR(MAX),   
            @query AS NVARCHAR(MAX),  
            @startdate datetime =  '1-Jan-2014',  
            @enddate datetime  =  '1-Jun-2014'

    ;with cte (StartDate, EndDate) as   
    (   
       select min(@startdate) StartDate, max(@enddate) EndDate   
       union all   
       select dateadd(mm, 1, StartDate), EndDate   
       from cte   
       where StartDate < EndDate   
    )   
    select StartDate   
    into #tempDates   
    from cte   

    select @cols =  STUFF((SELECT distinct ',' + QUOTENAME(convert(CHAR(10), StartDate, 120))   
        from #tempDates   
        FOR XML PATH(''), TYPE   
        ).value('.', 'NVARCHAR(MAX)')   
        ,1,1,'') 


        select @cols
        drop table #tempDates

【问题讨论】:

  • 感谢@Gidil 编辑,但我需要帮助来理解内容。
  • 老实说,我认为您应该在帖子中的任何地方都将 STUFF 这个词大写,否则看起来您只是想知道东西是如何工作的,您知道的,东西,东西,thingamajigs。

标签: sql sql-server xml sql-server-2008


【解决方案1】:

Stuff 适用于字符串,它对您的 SQL 所做的唯一事情就是从位置 1 中删除初始逗号。如果没有东西,它看起来像 ,a,b,c,d 但是当您将位置 1 填充为空值时它将其转换为 a,b,c,d

您的问题可能更多是关于 FOR XML 正在做什么。在这种情况下,FOR XML 被用作“技巧”,将#tempDates 中的所有行连接到一个长的逗号分隔字符串 ,a,b,c,d 中,而东西只是删除了第一个逗号。

对于 xml 正在创建一个字符串 x = ',a' + ',b' +',c' + ',d' 所以 x 最终为 ',a,b,c,d'

Stuff(x,1,1,'') 仅将位置 1 到 1 中的逗号替换为 '' 因此现在是 x='a,b,c,d'

[STUFF ( character_expression , start , length , replaceWith_expression )]

【讨论】:

  • 好的,我知道了,但如果第一个逗号只是用于替换,那么 hoe 逗号将出现在值之后
  • 太棒了!意味着第一个整个字符串的格式就像您在示例中提到的那样,然后 XML 将只删除第一个逗号。我认为它会从每一行中删除逗号,这些东西会得到。
  • 最后一个问题:XML 路径仅用于连接字符串 & 为什么这个 '.'在我的查询中使用。
  • '.'在 xml 路径中表示“当前元素”,所以基本上你将当前元素 (,a,b,c,d) 的值作为 nvarchar 并将其返回给 stuff 函数
  • 感谢您的努力。感谢您宝贵的时间。
猜你喜欢
  • 2017-07-06
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多