SQL Server 2012从表中创建值的字符串

时间:2017-03-23 00:24:16

标签: sql-server

我试图将表中的列值返回到一个变量的字符串中。

DECLARE @SCRIPT NVARCHAR(MAX)
DECLARE @START_T_DATE VARCHAR(30)
DECLARE @END_T_DATE VARCHAR(30)
DECLARE @col NVARCHAR(MAX)

SET @START_T_DATE = '1 Feb 2017'                       
SET @END_T_DATE = '1 Apr 2017'

SET @SCRIPT = "SET NOCOUNT ON
   SELECT   
   '['+CONVERT(VARCHAR(4), DATEPART(yyyy, DATE))+'_'+CONVERT(VARCHAR(2), DATEPART(mm, DATE))+'],' AS YEAR_MONTH
INTO ##YEAR_MONTH
FROM " + @database +"statement_runs (NOLOCK)
WHERE stmt_date >= '"+ @START_T_DATE+"'
AND stmt_date < '"+ @END_T_DATE+"'
GROUP BY '['+CONVERT(VARCHAR(4), DATEPART(yyyy, DATE))+'_'+CONVERT(VARCHAR(2), DATEPART(mm, DATE))+'],'"

返回以下内容

YEAR_MONTH
----------
[2017_2],
[2017_3],

然后我想循环遍历此表中的结果并返回变量@col以下字符串,从最后一个值中删除逗号。

@col = ('[2017_2],[2017_3]')

所以我试过循环,通过检查##YEAR_MONTH表中是否有值,但循环没有停止......

WHILE EXISTS (SELECT 1 
              FROM ##YEAR_MONTH)
BEGIN
    SET @COL = '(' SELECT YEAR_MONTH
                   FROM ##YEAR_MONTH
END


YEAR_MONTH
----------
[2017_2],
[2017_3],

我也试过这个,但只返回一个值

SET @COL = '('''+YEAR_MONTH+''')'
FROM ##YEAR_MONTH

('[2017_3],')

希望有人能指出我正确的方向。

由于

2 个答案:

答案 0 :(得分:0)

使用日历表模拟源查询,并使用stuff() with select ... for xml path ('') method of string concatenation

declare @fromdate date = '20170201'; 
declare @thrudate date = '20170331';
;with n as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n))
, dates as (
  select top (datediff(day, @fromdate, @thrudate)+1) 
      [Date]=convert(date,dateadd(day,row_number() over(order by (select 1))-1,@fromdate))
  from n as deka cross join n as hecto cross join n as kilo
                cross join n as tenK cross join n as hundredK
   order by [Date]
)
select 
  year_months = stuff((
      select distinct ', '+convert(varchar(7),[Date],120)
      from dates
      order by 1
      for xml path (''), type).value('.','nvarchar(max)')
    ,1,2,'')

rextester演示:http://rextester.com/WGWUK54259

返回:

+------------------+
|   year_months    |
+------------------+
| 2017-02, 2017-03 |
+------------------+

答案 1 :(得分:0)

如果您没有计数/日历表,则可以使用临时计数表。

这应该产生我认为是你想要的格式化字符串,我也认为是动态数据集。

Declare @Date1 date = '2017-02-01'
Declare @Date2 date = '2017-04-01'

Declare @col varchar(max)
Select @col = Stuff((Select ',' +QuoteName(Format(D,'yyyy_M')) 
                    From (
                            Select Top (DateDiff(MONTH,@Date1,@Date2)) 
                                   D=DateAdd(MONTH,-1+Row_Number() Over (Order By Number),@Date1) 
                             From  master..spt_values
                             Order By 1
                         ) X 
                    For XML Path ('')),1,1,'') 

Select @col

返回

[2017_2],[2017_3]