0

I need some help creating a stored procedure in SQL Server.

This is my code

CREATE PROCEDURE [dbo].[PROC_TABLE_ELEMENTS] 
    @id nvarchar(max)
AS
    DECLARE @sql varchar(max) = '', @col_list varchar(max) = ''

    SET @col_list = (SELECT DISTINCT QOUTENAME(columnName) + ',' 
                     FROM VW_FORM_ELEMENTS_DATA
                     FOR XML PATH(''))

    SET @col_list = LEFT(@col_list, LEN(@col_list) - 1)

    SET @sql = N'SELECT [newId], [modifiedDate], [modifiedBy], [modifiedBy]' + @col_list + 
                ' FROM (SELECT newId, value, columnName, modifiedDate, modifiedBy 
                        FROM VW_FORM_ELEMENTS_DATA 
                        WHERE newId = @id) a
                  PIVOT
                      (MAX([value]) FOR [columnName] IN (' + @col_list + ')) pv'

    EXEC (@sql)

I get this error:

Must declare the scalar variable "@id".

Dale K
  • 25,246
  • 15
  • 42
  • 71
  • Add `@id` as a parameter to the [`execute`](https://learn.microsoft.com/en-us/sql/t-sql/language-elements/execute-transact-sql?view=sql-server-ver15) statement. Otherwise the value isn't available to the dynamic SQL. – HABO Jan 29 '21 at 23:16
  • Please share sample data and your desired output. – Kazi Mohammad Ali Nur Romel Jan 30 '21 at 03:30

2 Answers2

0

This should work in SQL Server.

enter image description here

Dale K
  • 25,246
  • 15
  • 42
  • 71
0

this works:

CREATE PROCEDURE [dbo].[PROC_TABLE_ELEMENTS] 
@id nvarchar(max)
AS

declare @sql varchar(max)='',@col_list varchar(max)=''


set @col_list = (select distinct quotename(columnName)+',' from VW_FORM_ELEMENTS_DATA
for xml path(''))

set @col_list = left (@col_list,len(@col_list)-1)


set @sql = 'select [screenId],[newId],[modifiedDate],[modifiedBy],[modifiedBy]'+@col_list+' from
(SELECT screenId, newId, value, columnName, modifiedDate, modifiedBy FROM VW_FORM_ELEMENTS_DATA where screenId = ''' + @id + ''') a
pivot (max([value]) for [columnName] in ('+@col_list+'))pv'

exec (@sql)