What I have:
VIEW A
uid name
10 test1
20 test2
30 test3
40 test4
What I want:
ViewName ColName Row Value
View A uid 1 10
View A name 1 test1
View A uid 2 20
View A name 2 test2
What I have:
VIEW A
uid name
10 test1
20 test2
30 test3
40 test4
What I want:
ViewName ColName Row Value
View A uid 1 10
View A name 1 test1
View A uid 2 20
View A name 2 test2
You can assign row numbers in a CTE and then unpivot with UNION ALL
.
Notes:
uid
looks like an integer datatype while name
is a string, so you need to convert uid
to a VARCHAR
else UNION ALL
will raise an error.
obviously the ViewName
is harcoded in the query to viewA
Query:
WITH cte AS (
SELECT 'viewA' ViewName, uid, name, ROW_NUMBER() OVER(ORDER BY uid) rn FROM viewA
)
SELECT ViewName, 'uid' ColName, rn Row, CAST(uid AS varchar(50)) value FROM cte
UNION ALL SELECT ViewName, 'name' ColName, rn Row, name FROM cte
ORDER BY rn, ColName DESC
ViewName | ColName | Row | value :------- | :------ | :-- | :------ viewA | uid | 1 | 10 viewA | name | 1 | test1 viewA | uid | 2 | 20 viewA | name | 2 | test2 viewA | uid | 3 | 30 viewA | name | 3 | test3 viewA | uid | 4 | 40 viewA | name | 4 | test4
you could use a union based on a subquery on view_A
select 'View A', 'uid' colname, row_num, uid value
from (
SELECT
ROW_NUMBER() OVER(ORDER BY uid ASC) AS row_num, uid, name
from view_A
)
UNION ALL
select 'View A', 'name', row_num, name
from (SELECT
ROW_NUMBER() OVER(ORDER BY uid ASC) AS row_num, uid, name
from view_A)
ORDER BY row_num, colname
you can use this :
DECLARE @ViewName NVARCHAR(64) = 'ViewA'
DECLARE @Query NVARCHAR(MAX) = ''
SET @Query = '
SELECT ' + '''' + @ViewName + + '''' + ' AS ViewName,
C.[name] AS ColName,
V.[name] AS [Value],
DENSE_RANK() OVER( ORDER BY V.[Uid] ) AS [Row]
FROM ' + @ViewName + ' AS V
INNER JOIN sys.columns AS C ON C.object_id = OBJECT_ID(' + '''' + @ViewName + '''' + ')'
print @Query
EXECUTE SP_EXECUTESQL @Query