2016-10-05 2 views
0

У меня есть параметр в хранимой процедуре с именем grouplist. Здесь содержатся имена столбцов в разделенных запятыми значениях.Sql string replace issue

для например: @ = списке групп 'Class1, Class2, class3'

Мой запрос

Set @ Sql = 'выберите' + @grouplist +»от #final

Мои результат

Table result

Эти столбцы содержат значение "значение ZZTotal". Его следует заменить на «Всего». Это динамические столбцы.

Мне нужно заменить zztotal на общий.

В конечном выходе он должен быть, как этот

final output

Любая помощь приветствуется

+4

Ваш вопрос не имеет никакого контекста, чтобы сделать его понятным. Я не могу сказать, прочитав это, что вы пытаетесь сделать или что проблема. Вы можете начать здесь. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

@Sean Lange Я изменил вопрос – user1554650

+0

Ну, конечно, вопрос разный , к сожалению, это не более понятно, чем было раньше. Я бы назвал запрос с динамическим выбором столбцов таким образом. Если вы застряли с использованием динамического sql, вам придется преодолеть некоторые серьезные препятствия, чтобы снять это. Вам нужно предоставить более подробную информацию здесь. Скорее всего, вам понадобится сплиттер строк для восстановления динамического sql. –

ответ

2

Существует большая проблема, которая игнорируется: есть, скорее всего, причина того, что текст уже ZZTotal вместо Total. И эта причина, скорее всего, для поддержания правильного упорядочения строк (т. Е. Сохранения итогов в нижней части).

Строки ZZTotal, скорее всего, автоматически генерируются SQL Server с помощью опции ROLLUP в предложении GROUP BY. Первоначально параметр ROLLUP помещает NULL в каждую «группу», которая свертывается, так как строка «Всего» (или любая строка) не помещается в столбец нестроковых типов данных. Я предполагаю, что значения NULL были заменены на ZZTotal через ISNULL() при сдаче результатов в #final.

Текущая проблема заключается в том, что если заменить ZZTotal значения с Total, то «Всего» строки, возможно, не будут в нижней части этой группировки, по крайней мере, не для каких-либо групп, которые содержат строки, начинающиеся с U... или Tp... , или Tou..., и так далее.

  1. Первым шагом является добавление IDENTITY столбец в таблице #final. Вы делаете это, изменяя запрос, который создает и заполняет #final, добавив IDENTITY(INT, 1, 1) AS [RowNum], в качестве первого столбца инструкции SELECT.

  2. Второй шаг, чтобы изменить ISNULL(column, 'ZZTotal') запроса, который заполняет #final вместо этого будет (для Class2, например):

    IIF(GROUPING(class2) = 0, class2, N'Total for ' + class1) AS [Class2] 
    

    Обратите внимание на использование «class1», а не «class2» , в конце N'Total for ' + class1.

  3. Третий/конечный шаг состоит в том, чтобы добавить ORDER BY [RowNum] в конец заявления Set @Sql=.Окончательный запрос должен быть чем-то вроде:

    SELECT Class1, Class2, Class3 FROM #final ORDER BY [RowNum]; 
    

Пример 1: ROLLUP поведение по умолчанию

SELECT ss.[name] AS [SchemaName], 
     so.[type_desc] AS [ObjectType], 
     COUNT(*) AS [ObjectCount] 
FROM [master].sys.schemas ss 
INNER JOIN [master].sys.objects so 
     ON so.[schema_id] = ss.[schema_id] 
GROUP BY ss.[name], so.[type_desc] WITH ROLLUP; 

Пример 2: ROLLUP нулями заменены в GROUPING рядами

SELECT IIF(GROUPING(ss.[name]) = 0, ss.[name], N'Total') AS [SchemaName], 
     IIF(GROUPING(so.[type_desc]) = 0, 
      so.[type_desc], 
      IIF(GROUPING(ss.[name]) = 0, 
       N'Total for ' COLLATE Latin1_General_CI_AS_KS_WS + ss.[name], 
       N'---------------------------------------->') 
     ) AS [ObjectType], 
     COUNT(*) AS [ObjectCount] 
FROM [master].sys.schemas ss 
INNER JOIN [master].sys.objects so 
     ON so.[schema_id] = ss.[schema_id] 
GROUP BY ss.[name], so.[type_desc] WITH ROLLUP; 

Пример 3: Добавление столбца IDENTITY и INTO пункта к примеру # 2

SELECT IIF(GROUPING(ss.[name]) = 0, ss.[name], N'Total') AS [SchemaName], 
     IIF(GROUPING(so.[type_desc]) = 0, 
      so.[type_desc], 
      IIF(GROUPING(ss.[name]) = 0, 
       N'Total for ' COLLATE Latin1_General_CI_AS_KS_WS + ss.[name], 
       N'---------------------------------------->') 
     ) AS [ObjectType], 
     COUNT(*) AS [ObjectCount], 
     IDENTITY(INT, 1, 1) AS [RowNum] 
INTO #TempResults 
FROM [master].sys.schemas ss 
INNER JOIN [master].sys.objects so 
     ON so.[schema_id] = ss.[schema_id] 
GROUP BY ss.[name], so.[type_desc] WITH ROLLUP; 

SELECT * FROM #TempResults ORDER BY [RowNum]; 
+0

Хороший! Это гораздо более информативный ответ, чем мой (удаленный). Один * глупый * вопрос, я не использовал группу с помощью rollup, он всегда добавляет ZZ автоматически, или это то, что вы добавляете вручную? – gofr1

+0

@ gofr1 Нет, 'ROLLUP' должен использовать' NULL', вероятно, потому что это единственное общее значение, которое может использоваться во всех типах данных. «Всего» и «ZZTotal» добавляются вручную после факта через 'ISNULL' или' IIF'/'CASE', как я описал здесь. –

+0

Спасибо, для уточнения! – gofr1