sql >> データベース >  >> RDS >> Sqlserver

動的SQLServerピボット(UNPIVOT)列名から行値へ

    したがって、いくつかの問題があります... 1つ目は、テーブルと列が事前にわからないため、単純なunpivotを使用できないため、動的SQLが必要になることです。

    これは、システムテーブルから列名を取得する必要があることも意味します。

    2番目の問題は、すべてのデータ型が不明であるため、すべての列をすべてと任意の長さをサポートできるものにキャストする必要があることです... varchar(max)。

    したがって、これら2つの障害を念頭に置いて、ここに解決策があります。

    declare @yourTable varchar(50)
    declare @yourKeyField varchar(50)
    declare @yourKey varchar(50)
    
    set @yourTable = 'MyTable' /** change to tablename or pass as parameter */
    set @yourKeyField = 'ID'   /** change to fieldname or pass as parameter */
    set @yourKey = '5'         /** change to key value or pass as parameter */
    
    declare @query nvarchar(max)  
    
    select @query = COALESCE(@query+' union all ','') + 'select ''' + c.name + ''' as
    [Column], Cast([' + c.name + '] AS VarChar(MAX)) as [Value] from ' + @yourTable + ' 
    where ' + @yourKeyField + ' = ''' + @yourKey + '''' from syscolumns c 
        inner join sysobjects o on c.id = o.id and o.xtype = 'u'
        where o.name = @yourTable order by c.colid
    
    exec sp_executesql @query /** execute query */
    

    最後に、(パフォーマンスの観点とインジェクションの可能性の両方の観点から)それに伴う危険性を警告せずに動的SQLを使用するソリューションを良心的に推奨することはできません。このテーマに関する知識を深めたい場合は、この優れた記事をお読みください。

    http://www.sommarskog.se/dynamic_sql.html




    1. 次の行の値を使用してテーブルに列を追加する

    2. SQL ServerでのACOS()の例

    3. テーブルまたは列がデータベースに存在するかどうかを確認するにはどうすればよいですか?

    4. SQL:グループごとの最大レコードを検索します