macshe 发表于 2016-10-30 05:13:10

SQL练手(SQL Server 2000)

不写sql好久,都有些陌生了,刚好朋友问我一个问题,就顺便写了这些


[*]取得表的结构属性
select * from information_schema.columns  where  table_name='authors';


[*]初级游标使用
要完成的一个小功能:将一个数据表的列变成行,将某一单行相应的列值放到其右边。具体效果为图片中所示。
说明:下面的存储过程在SQL Server 2000上成功运行,使用自带的pubs数据库authors表。
   sql 代码
 

[*]create PROC sp_row_col @au_id varchar(50)  
[*]as        
[*]    /* 声明游标 */  
[*]    declare colCursor CURSOR for   
[*]    select column_name from information_schema.columns where table_name='authors'; /* 取得列名 */  
[*]      
[*]    declare @col varchar(50);  
[*]    declare @colValue varchar(100);  
[*]    declare @sqlStr varchar(200)  
[*]  
[*]    open colCursor;  /* 打开游标 */  
[*]    fetch next from colCursor into @col;  
[*]    while @@FETCH_STATUS=0  /* 系统变量@@FETCH_STATUS为0表示FETCH语句成功,-1:失败或此行不在结果集中,-2:被提取的行不存在. 注:不同的DBMS这里有所不同*/  
[*]    begin  
[*]        set @sqlStr = 'declare valCursor CURSOR for SELECT '+ @col + ' FROM authors where au_id='''+@au_id+''''; /* 用变量作select列名的解决办法,不知道还有没有更好一些的? */  
[*]        exec (@sqlStr);  
[*]          
[*]        open valCursor;  
[*]        fetch next from valCursor into @colValue;             
[*]        close valCursor /* 关闭游标 */  
[*]        deallocate valCursor /* 释放游标 */  
[*]          
[*]        insert into row_col values(@col, @colValue);  
[*]        fetch next from colCursor into @col;  
[*]    end  
[*]    close colCursor /* 关闭游标 */  
[*]    deallocate colCursor /* 释放游标 */   
[*]return  
[*]  
[*]go   
[*]use pubs;  
[*]create table row_col (column_name varchar(50), col_value varchar(50));  
[*]exec sp_row_col '172-32-1176' 
[*]
[*]select * from row_col;  
[*]select * from authors;
[*] 



ps: 写这些google了N多次,主要是原来都还没有用过游标,汗ing,还有就是解决如何在语句中嵌入变量这个问题。 开始慢慢地体会到自己知识的浅薄了。
页: [1]
查看完整版本: SQL练手(SQL Server 2000)