我试图将表中的列值返回到一个变量的字符串中。
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],')
希望有人能指出我正确的方向。
由于
答案 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]