Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Nazwa kolumny Dynamic SQL Server Pivot (UNPIVOT) do wartości wiersza

Masz więc kilka problemów... po pierwsze, wymaga to dynamicznego sql, ponieważ tabela i kolumny nie są znane z wyprzedzeniem, więc nie możesz po prostu użyć prostego unpivot.

Oznacza to również, że będziesz musiał pobrać nazwy kolumn z tabel systemowych.

Drugim problemem jest to, że wszystkie twoje typy danych są nieznane, więc musisz rzutować wszystkie kolumny na coś, co może obsłużyć wszystko i dowolną długość... varchar(max).

Mając na uwadze te dwie przeszkody, oto rozwiązanie:

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 */

Wreszcie, nie mogę z czystym sumieniem polecić rozwiązania, które używa dynamicznego sql bez ostrzeżenia o niebezpieczeństwach z nim związanych (zarówno z punktu widzenia wydajności, jak i możliwości wstrzyknięcia). Przeczytaj ten doskonały artykuł, jeśli chcesz poszerzyć swoją wiedzę na ten temat.

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sp_send_dbmail wykonane z zadania nie powiodło się z wynikiem zapytania dołączonym jako plik

  2. jak skonfigurować maksymalne wykorzystanie pamięci SQL Server

  3. Jak przekonwertować datetime na perski w SQL Server

  4. Użyj CRYPT_GEN_RANDOM(), aby utworzyć kryptograficzną, losową liczbę w SQL Server

  5. Muszę przekazać nazwy kolumn za pomocą zmiennej w instrukcji select w procedurze sklepu, ale nie mogę użyć dynamicznego zapytania