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

Dynamiczny SQL Server 2005 Pivot

Ostatnio wykonałem zbyt wiele takich dynamicznych zapytań... (moje kolumny zmieniają się w zależności od klienta z miesiąca na miesiąc). Oto jeden sposób, aby to zrobić — bez testowania, bez debugowania, może być kilka błędów do naprawienia:

DECLARE
  @Command     nvarchar(max)
 ,@ColumnList  nvarchar(max)
 ,@OrderId     int
 ,@Debug       bit


--  Build a comman-delimited list of the columns
SELECT @ColumnList = isnull(@ColumnLIst + ',', , '') + ColName
 from dbo.GetTableColumnNames('OrderCash', 2)


--  Insert the list of columns in two places in your query
SET @Command = replace('
SELECT  OrderID, 
        CurrCode + ‘‘GBP CURNCY’‘ AS Ticker, 
        Cash AS Position 
FROM 
( 
    SELECT OrderID, <@ColumnList>
    FROM OrderCash 
) p 
UNPIVOT 
( 
    Cash FOR CurrCode IN  
    (<@ColumnList>) 
) AS unpvt 
WHERE Cash != 0 
And OrderID = @OrderId
', '<@ColumnList>', @ColumnList)


--  Always include something like this!
IF @Debug = 1
    PRINT @Command

--  Using sp_executeSQL over EXECUTE (@Command) allows you execution
--  plan resuse with parameter passing (this is the part you may need
--  to debug on a bit, but it will work)
EXECUTE sp_executeSQL @Command, N'@OrderId int', @OrderId



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Problem z funkcją okna w SQL Server 2008 R2

  2. domyślna kontrola współbieżności dla serwera sql 2005

  3. Poprawka:„Nie można wykonać DZIENNIKA KOPII ZAPASOWEJ, ponieważ nie ma bieżącej kopii zapasowej bazy danych”. w SQL Server/SQL Edge

  4. Łamigłówka impasu:ofiara nie posiada żadnego zasobu używanego do zabijania w celu rozwiązania impasu

  5. SQL MAX wielu kolumn?