Note that there are some explanatory texts on larger screens.

plurals
  1. POCreating View with dynamic columns by stored procedure
    primarykey
    data
    text
    <p>I'm stuck in implementing a stored procedure for generating a view with dynamically columns. This view should represent following PIVOT SQL-Statement as shown here:</p> <p><a href="http://www.sqlfiddle.com/#!3/204da/4" rel="nofollow">SQL Fiddle Demo</a></p> <p>Why i am using a stored procedure with dynamic SQL? The requirements are, to implement a database object, which behaves like shown statement working on MSSQL 2005 until now and also on Oracle starting with 9i (unfortunatelly...). Now, because of missing deeper knowledge on how to implement in a better way, i decided to use a stored procedure.</p> <p>But now im stuck and any suggestions are highly appreciated. Also any suggestion on how to implement in a better way but with the same result like shown SQL Fiddle Demo are welcome.</p> <p>My SP currently looks like that:</p> <pre><code>create procedure GeneratePivotLeistungsbewertungen as SET NOCOUNT ON; DECLARE cActivityNames CURSOR FOR SELECT distinct ActivityName FROM Leistungsbewertungen DECLARE @name VARCHAR(32) DECLARE @dyn_col_list NVARCHAR(MAX) OPEN cActivityNames FETCH NEXT FROM cActivityNames INTO @name WHILE @@FETCH_STATUS = 0 BEGIN SET @dyn_col_list = @dyn_col_list + N'(select lb.Bewertungswert from Leistungsbewertungen lb where lb.ActivityName = '+ @name +' and lb.LeistungsId = o.LeistungsId)' + @name + ',' FETCH NEXT FROM cActivityNames INTO @name END deallocate cActivityNames select LEFT(@dyn_col_list, LEN(@dyn_col_list)-1) DECLARE @execVar NVARCHAR(MAX) = N' VIEW dbo.PivotLeistungsbewertungen AS SELECT max(o.LeistungsId) LeistungsId, max(o.Gnr) GOP,' + @dyn_col_list + 'FROM leistungen o group by o.LeistungsId' SET @execVar = CASE WHEN EXISTS (SELECT 1 FROM sys.views WHERE [object_id] = OBJECT_ID('dbo.PivotLeistungsbewertungen')) THEN N'ALTER' ELSE N'CREATE' + @execVar END; BEGIN TRY EXEC sp_executesql @execVar; END TRY BEGIN CATCH PRINT ERROR_MESSAGE(); END CATCH go </code></pre> <p>Any ideas why it doesn't create the view if you call it like that:</p> <pre><code>USE [Q20133_0_NO] GO DECLARE @return_value int EXEC @return_value = [dbo].[GeneratePivotLeistungsbewertungen] SELECT 'Return Value' = @return_value GO </code></pre> <p><strong>EDITED for Solutions (2005/2008R2)</strong></p> <p><strong>Updated with working Stored Procedure (tested under SQLServer 2008 R2</strong></p> <pre><code>CREATE PROCEDURE GeneratePivotLeistungsbewertungen AS SET NOCOUNT ON; DECLARE @name VARCHAR(32) DECLARE @dyn_col_list NVARCHAR(MAX) = '' SELECT @dyn_col_list = isnull(@dyn_col_list + ',', '') + N'( select lb.Bewertungswert from Leistungsbewertungen lb where lb.ActivityName = ''' + ActivityName + ''' and lb.LeistungsId = o.LeistungsId )' + ActivityName FROM Leistungsbewertungen GROUP BY ActivityName DECLARE @execVar NVARCHAR(MAX) = N' VIEW dbo.PivotLeistungsbewertungen AS SELECT max(o.LeistungsId) LeistungsId, max(o.Gnr) GOP' + @dyn_col_list + ' FROM leistungen o group by o.LeistungsId' SET @execVar = CASE WHEN EXISTS ( SELECT 1 FROM sys.VIEWS WHERE [object_id] = OBJECT_ID('dbo.PivotLeistungsbewertungen') ) THEN N'ALTER' + @execVar ELSE N'CREATE' + @execVar END; BEGIN TRY EXEC sp_executesql @execVar; END TRY BEGIN CATCH PRINT ERROR_MESSAGE(); END CATCH </code></pre> <p><strong>For SQLServer 2005 it has to be following Implementation (also working with 2008 R2)</strong></p> <pre><code>DECLARE @execVar NVARCHAR(200) SET @execVar = CASE WHEN EXISTS ( SELECT 1 FROM sys.procedures WHERE [object_id] = OBJECT_ID('dbo.GeneratePivotLeistungsbewertungen') ) THEN N'DROP PROCEDURE GeneratePivotLeistungsbewertungen;' END; EXEC(@execVar) go CREATE PROCEDURE GeneratePivotLeistungsbewertungen AS SET NOCOUNT ON; DECLARE @name VARCHAR(32) DECLARE @dyn_col_list NVARCHAR(MAX) SET @dyn_col_list = '' SELECT @dyn_col_list = isnull(@dyn_col_list + ',', '') + N'( select lb.Bewertungswert from Leistungsbewertungen lb where lb.ActivityName = ''' + ActivityName + ''' and lb.LeistungsId = o.LeistungsId ) AS ' + ActivityName FROM Leistungsbewertungen GROUP BY ActivityName ORDER BY MAX(Bewertungsschritt) DECLARE @execVar NVARCHAR(MAX) SET @execVar = N' VIEW dbo.PivotLeistungsbewertungenView AS SELECT max(o.LeistungsId) LeistungsId, max(o.Gnr) GOP' + @dyn_col_list + ' FROM leistungen o group by o.LeistungsId' SET @execVar = CASE WHEN EXISTS ( SELECT 1 FROM sys.VIEWS WHERE [object_id] = OBJECT_ID('dbo.PivotLeistungsbewertungenView') ) THEN N'ALTER' + @execVar ELSE N'CREATE' + @execVar END; BEGIN TRY EXEC sp_executesql @execVar; END TRY BEGIN CATCH PRINT ERROR_MESSAGE(); END CATCH GO </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload