SQLSERVER 动态转列,生成动态视图

SQLSERVER 动态转列,生成动态视图

创建测试数据

create table test_1(col1 varchar(10),col2 varchar(10),col3 varchar(10));

insert into test_1 values('a','b','c');
insert into test_1 values('q','w','z');
insert into test_1 values('o','p','q');

 

创建存储过程

CREATE PROC SP_ACTIVE_SQL
AS
BEGIN
  -- DECLARE THE VARIABLES TO STORE THE VALUES RETURNED BY FETCH.
  DECLARE @V_COL1 VARCHAR(10), @V_COL2 VARCHAR(10),@V_STRING1 VARCHAR(8000),@V_STRING2 VARCHAR(8000),@V_SQL VARCHAR(8000)

  DECLARE CONTACT_CURSOR CURSOR FOR SELECT COL1,COL2 FROM TEST_1
  OPEN CONTACT_CURSOR
  FETCH NEXT FROM CONTACT_CURSOR
  INTO @V_COL1, @V_COL2
  -- CHECK @@FETCH_STATUS TO SEE IF THERE ARE ANY MORE ROWS TO FETCH.
  WHILE @@FETCH_STATUS = 0
  BEGIN
      IF(@V_STRING1 IS NULL) 
          BEGIN 
              SET @V_STRING1 =  '''' + @V_COL2+ ''' AS ' + @V_COL1
          END 
      ELSE 
          BEGIN 
              SET @V_STRING1 = @V_STRING1 + ','''+ @V_COL2+''' AS '+@V_COL1
          END 

      IF(@V_STRING2 IS NULL) 
          BEGIN 
              SET @V_STRING2 =  'CASE WHEN COL2=' + @V_COL1 +' THEN COL3 ELSE NULL END AS '+ @V_COL1
          END 
      ELSE 
          BEGIN 
              SET @V_STRING2 = @V_STRING2 +', CASE WHEN COL2=' + @V_COL1 +' THEN COL3 ELSE NULL END AS '+ @V_COL1
          END       

     -- THIS IS EXECUTED AS LONG AS THE PREVIOUS FETCH SUCCEEDS.
    FETCH NEXT FROM CONTACT_CURSOR
    INTO @V_COL1, @V_COL2
  END
  CLOSE CONTACT_CURSOR
  DEALLOCATE CONTACT_CURSOR

  --生成SQL语句
  SET @V_SQL='SELECT T1.*,' + @V_STRING2+ ' FROM (SELECT DISTINCT COL2,COL3 FROM TEST_1) T1,(SELECT ' + @V_STRING1 + ') T'
  --PRINT @V_SQL
  EXEC(@V_SQL) 
END 

存储过程作为表进行查询

exec SP_ACTIVE_SQL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值