2016-09-07 7 views
0

Здесь много вопросов об именовании столбца переменной, я не верю, что это дубликат, поскольку я хотел бы использовать расчет.Рассчитанная дата как имя столбца SQL Server 2008

Я хотел бы назвать свою колонку после предыдущего месяца. Я бы ожидать, что это работает:

SELECT isnull(sum(CASE when datepart(mm,rc.datetime) = DATEPART(MONTH, GETDATE()) -1 then 1 else null end),0) AS datename(MM, dateadd(MM, -1, getdate())) 

или для читаемости:

... AS datename(MM, dateadd(MM, -1, getdate())) 

Но это не так, я получаю неправильный синтаксическую ошибку. Возможно ли это? Заранее благодарим за предоставленную помощь.

+3

только с динамическим SQL – Squirrel

+0

Изменение имени столбца динамически собирается вызвать ряд проблемы в будущем. Возможно, с лучшим пониманием того, что вы действительно пытаетесь сделать здесь, мы могли бы помочь найти лучшее решение. В противном случае динамические параметры sql, уже опубликованные, должны работать нормально. –

+0

Еще один комментарий состоит в том, что я предпочитаю избегать сокращений для деталей даты, но если вы собираетесь их использовать, вы должны быть последовательными. В некоторых местах вы используете MM и другие месяцы. http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx –

ответ

2

Попробуйте это с динамическим SQL,

DECLARE @sql NVARCHAR(max) = '' 

SET @sql = 'SELECT isnull(sum(CASE 
       WHEN datepart(mm, rc.DATETIME) = ' + convert(VARCHAR(10), DATEPART(MONTH, GETDATE())) + ' - 1 
        THEN 1 
       ELSE NULL 
       END), 0) AS ' + datename(MM, dateadd(MM, - 1, getdate())) 

EXEC sp_executesql @sql 
2

В соответствии с комментарием, достижим только с использованием динамического SQL:

DECLARE @sql NVARCHAR(MAX); 
SELECT @sql = N'SELECT isnull(sum(CASE when datepart(mm,rc.datetime) = DATEPART(MONTH, GETDATE()) -1 then 1 else null end),0) AS [' + datename(MM, dateadd(MM, -1, getdate())) +'];' 
EXEC sp_executesql @sql