Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Pivot SQL Server 2005 động

Tôi đã thực hiện quá nhiều truy vấn động này vào cuối năm ... (các cột của tôi thay đổi theo khách hàng theo tháng). Đây là một cách để làm điều đó - không cần thử nghiệm, không cần gỡ lỗi, có thể có một vài lỗi cần khắc phục:

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. Ràng buộc chỉ một bản ghi được đánh dấu là mặc định

  2. Nhận ID của một đối tượng từ Tên của nó trong SQL Server:OBJECT_ID ()

  3. 10 SP_EXECUTESQL Cần tránh để có SQL động tốt hơn

  4. Lỗi kích hoạt:Giao dịch hiện tại không thể được cam kết và không thể hỗ trợ các hoạt động ghi vào tệp nhật ký

  5. Xử lý lỗi trong Asp cổ điển mà không có lỗi hết thời gian chờ