2017-03-23 3 views
0

Ich versuche, Spaltenwerte aus einer Tabelle in eine Zeichenfolge mit einer Variablen zurückzugeben.SQL Server 2012 Erstellen von Zeichenfolge von Werten aus einer Tabelle

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))+'],'" 

Welche der folgenden

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

ich dann in einer Schleife in dieser Tabelle durch die Ergebnisse wollen zurück und zurück in die Variable @col die folgende Zeichenfolge, das Komma aus dem letzten Wert zu entfernen.

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

Also, was ich versucht habe, ist Looping, indem geprüft wird, ob ein Wert in der ##YEAR_MONTH Tabelle, aber die Schleife nicht zu stoppen ...

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


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

Ich habe auch versucht, diese , aber gibt nur einen Wert zurück

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

('[2017_3],') 

Hoffe, dass jemand mich in die richtige Richtung zeigen kann.

Dank

+0

SELECT @COL + = ... 'statt' SET @COL = 'und' STUFF (@COL, LEN (@COL) - 1, 1 ' ")". Wenn das Komma am Anfang und nicht am Ende steht, wird das Entfernen des führenden Kommas so einfach wie 'STUFF (@COL, 1, 1, '')'. Abgesehen davon kann Ihre gesamte Anfrage wahrscheinlich vereinfacht werden. – ZLK

+0

Hallo, danke, dass du mich in die richtige Richtung gelenkt hast ... Ich habe folgendes versucht und es scheint zu tun, was ich will. SET SELECT @COL = '(' '' + STUFF ((SELECT '' + [year_month] \t \t \t FROM ## YEAR_MONTH \t \t \t ORDER BY [year_month] \t \t \t FOR XML PATH ('')), 1, 1, '') + '' ')' AS [Ausgabe] – HL8

Antwort

0

einen Kalender Tabelle mit Ihrer Quellabfrage zu simulieren, und die stuff() with select ... for xml path ('') method of string concatenation verwenden.

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 Demo: http://rextester.com/WGWUK54259

kehrt:

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

Sie können ein Ad-hoc-tally Tabelle verwenden, wenn Sie nicht über eine tally/Kalender-Tabelle haben.

Dies sollte produzieren, was ich vermute, ist Ihre gewünschte formatierte Zeichenfolge, für was ich auch vermutet, ist für eine dynamische Pivot.

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 

Returns

[2017_2],[2017_3] 
Verwandte Themen