Использование таблицы подсчета - лучший подход здесь, чем цикл. Конечно, этот цикл невелик и вряд ли вызовет множество проблем с производительностью, но таблица с таблицами настолько проста, что ее следует использовать здесь. Моя личная любимая статья, объясняющая таблицы таблиц, может быть найдена на центральном сервере sql. http://www.sqlservercentral.com/articles/T-SQL/62867/
Взяв код, который Богдан Богданов разместил здесь, так это то, как вы могли бы преобразовать его в таблицу таблиц вместо цикла.
Сначала вам нужна таблица подсчета. Я делаю это в своей системе с представлением.
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
GO
Теперь, когда это мнение, мне не нужно беспокоиться о его повторном письме. Просто используйте его.
DECLARE @SqlCmd VARCHAR(MAX);
SET @SqlCmd = 'SELECT [LOC], [PRODUCT], [STATUS] ';
select @SqlCmd = @SqlCmd + ', [' + cast(N as varchar(2)) + '-2015], [' + cast(N as varchar(2)) + '-2016]'
from cteTally
where N <= 53
SET @SqlCmd = @SqlCmd + ' FROM [LGI_Temp].[dbo].[Temp_PIVOT];'
select @SqlCmd
Большая проблема здесь, поскольку я вижу, что эта таблица ужасно денормирована. Вместо столбца для каждого месяца у вас должен быть столбец даты ... хотя от имени это выглядит как постоянная таблица «temp», используемая для точки опоры. Существуют более эффективные способы динамического преобразования строк в столбцы. Вокруг этого сайта людям нравится Динамический Pivot. Я лично предпочитаю динамическую перекрестную вкладку, но это предпочтение. Я нахожу, что синтаксис для кросс-вкладки менее тупой, и от него даже небольшое преимущество.
Какая ваша СУБД (SQL Server od MySql)? –
Вы можете создать хранимую процедуру и использовать dynamic-SQL. http://stackoverflow.com/questions/10092869/can-i-pass-column-name-as-input-parameter-in-sql-stored-procedure –
Я использую SQL Server @BogdanBogdanov –