2015-08-03 2 views
0

Ниже приведен скрипт. Я пытаюсь назвать имена столбцов динамически. Первые 3 столбца: LOC, Product и status. Есть 53 столбцов atfer, что с 2015 года и на 2016 год, как: 1-2015, 2-2015, 3-2015 ... 53-2015 и 1-2016, 2-2016, 3-2016 ... 53-2016. Я хочу построить динамический SQL для вызова всех этих столбцов. Я делаю это, потому что я хочу его в определенном порядке, который я не могу получить, если я использую SELECT * FORM TABLE.Как динамически вызывать столбцы в SQL Server?

declare @values varchar(max) 

declare @n varchar(10) 

set @n = 1 

set @values = ' 
    SELECT[LOC] 
    ,[PRODUCT] 
    ,[STATUS] 
    ,['[email protected]+'-2015] 
    ,['[email protected]+'-2016] 
FROM [LGI_Temp].[dbo].[Temp_PIVOT]'; 
exec(@values); 

Это дает мне результат, как:

LOC  PRODUCT  STATUS 1-2015 1-2016 

Я хочу, чтобы это для всех 53 значений в каждом году.

Как это сделать?

+0

Какая ваша СУБД (SQL Server od MySql)? –

+0

Вы можете создать хранимую процедуру и использовать dynamic-SQL. http://stackoverflow.com/questions/10092869/can-i-pass-column-name-as-input-parameter-in-sql-stored-procedure –

+0

Я использую SQL Server @BogdanBogdanov –

ответ

3

Использование таблицы подсчета - лучший подход здесь, чем цикл. Конечно, этот цикл невелик и вряд ли вызовет множество проблем с производительностью, но таблица с таблицами настолько проста, что ее следует использовать здесь. Моя личная любимая статья, объясняющая таблицы таблиц, может быть найдена на центральном сервере 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. Я лично предпочитаю динамическую перекрестную вкладку, но это предпочтение. Я нахожу, что синтаксис для кросс-вкладки менее тупой, и от него даже небольшое преимущество.

+0

Спасибо @Sean Lange, отлично работает :-) –

+1

Я также предпочитаю [динамическую кросс-таблицу] (http://www.sqlservercentral.com/articles/Crosstab/65048/) вместо динамического поворота. Ха, похоже, мы оба учимся у Джеффа. ;) –

0

Хорошо, попробуйте следующее:

DECLARE @SqlCmd VARCHAR(MAX); 
DECLARE @colN VARCHAR(10); 

SET @SqlCmd = 'SELECT [LOC], [PRODUCT], [STATUS] '; 
SET @colN = 1; 

WHILE (@colN < 54) 
BEGIN 
    SET @SqlCmd = @SqlCmd + ',[' + @colN + '-2015],[' + @colN + '-2016]'; 
    SET @colN = @colN + 1; 
END; 

SET @SqlCmd = @SqlCmd + ' FROM [LGI_Temp].[dbo].[Temp_PIVOT];' 

EXEC (@SqlCmd); 

Замечание: Это не самое лучшее решение. Я просто попытаюсь показать быстрый пример. См. Комментарий @Sean Lange ниже.

+0

Я пишу, что он не может этого сделать, потому что отсутствует '' '. И похоже, что он хочет вызвать непосредственно select + string concat. –

+0

Я не спускал вниз, но использование цикла здесь ужасно неэффективно. Это отличная возможность для таблицы подсчета или числа. Вот моя личная любимая статья на эту тему. http://www.sqlservercentral.com/articles/T-SQL/62867/ –

+0

Согласен, @Sean Lange, просто хочу обновить свой ответ с помощью exmaple. Я также хочу показать ему быстрое решение. Может быть, ему нужно вызвать только специальный запрос. –

Смежные вопросы