Выберите значение представления с именем представления и именем столбца - PullRequest
0 голосов
/ 02 октября 2019

Что у меня есть:

VIEW A 
uid name
10   test1
20   test2
30   test3
40   test4

Что я хочу:

ViewName  ColName Row Value   
View A    uid     1   10
View A    name    1   test1
View A    uid     2   20
View A    name    2   test2

Ответы [ 3 ]

2 голосов
/ 02 октября 2019

Вы можете назначить номера строк в CTE, а затем отключить с помощью UNION ALL.

Примечания:

  • uid выглядит как целочисленный тип данных, в то время как name является строкой, поэтому вам необходимо преобразовать uid в VARCHAR elseUNION ALL вызовет ошибку.

  • очевидно, что ViewName кодируется в запросе на viewA

Запрос:

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

Демонстрация на DB FIddle :

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           
0 голосов
/ 02 октября 2019

вы можете использовать это:

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
0 голосов
/ 02 октября 2019

вы можете использовать объединение на основе подзапроса для 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
...