2016-09-09 7 views
4

Gday Все,Использование Dynamic Pivot SQL в представлении

Я написал код, динамически Опускайте таблицу как SQL Server : Transpose rows to columns

код выглядит как этот

DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX) 

SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(FieldName) 
      FROM CORE_Items_Extra 
      WHERE Not(FieldName = '') 
      ORDER BY 1 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,'') 

SET @sql = 'SELECT ItemID, ' + @cols + ' 
       FROM 
      (
       SELECT ItemID, FieldValue, FieldName 
       FROM CORE_Items_Extra 
      ) AS SourceTable 
      PIVOT 
      (
       MAX(FieldValue) FOR FieldName IN (' + @cols + ') 
      ) AS PivotTable;' 

EXECUTE(@sql) 

, который работает отлично, НО Я хочу использовать его в представлении, я попытался скопировать код в представление, но он работает, но не сохраняет, поскольку ему не нравятся заявления Declare в представлении, я работал в хранимой процедуре, но не могу используйте хранимые процедуры в представлении, я думаю, что мне нужно иметь его как значение таблицы d Функция, но не может использовать оператор Execute в TBF. Мне нужно объединить эти данные с другой таблицей в представлении и хотелось бы сохранить ее динамично, поэтому любые идеи были бы очень благодарны :) Мы используем SQL 2008 R2

ответ

0

Учитывая, что вы пытаетесь сделать, я считаю, что единственное опция заключается в использовании хранимой процедуры для этого. Представления ограничены операторами SELECT с помощью CTE и функций. Более сложные исполнения не будут работать.

Несколько других идей:

1) Если вы хотите, чтобы скрыть разработки можно вставить результат, установленные в таблицу и, возможно, запланировать процедуру с динамическим кодом для запуска ежедневно в работе агента или что-то для обновления таблицы.

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

2

Я предлагаю вам создать некоторое представление (myView в образце ниже), а затем написать хранимую процедуру, которая будет изменять свой вид, как:

CREATE VIEW myView 
AS 
SELECT 1 
GO 

CREATE PROCEDURE myStoredProc 
AS 
BEGIN 
    DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX) 

    SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(FieldName) 
       FROM CORE_Items_Extra 
       WHERE Not(FieldName = '') 
       ORDER BY 1 
       FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)'),1,1,'') 

    SET @sql = 'ALTER VIEW myView 
       AS 
       SELECT ItemID, ' + @cols + ' 
        FROM 
       (
        SELECT ItemID, FieldValue, FieldName 
        FROM CORE_Items_Extra 
       ) AS SourceTable 
       PIVOT 
       (
        MAX(FieldValue) FOR FieldName IN (' + @cols + ') 
       ) AS PivotTable;' 

    EXECUTE(@sql) 
END 
GO 

Выполнить это СП в работе один или несколько раз в день.