非常实用的SQL语句

Posted on 2019-04-01 16:42  嚯嚯的狼矛枪  阅读(237)  评论(0)    收藏  举报

--查询什么存储过程和视图用到了这个字段

select distinct b.name from syscomments a,sysobjects b where a.id=b.id and a.text LIKE '%xxx%'

 

--查询一个表有什么字段

select name from SysColumns where id=Object_Id('表名')

 

--查询一个表的字段以及数据类型,长度

SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'task_247'

 

--老是忘记如何连表UPDATE,记录一下吧

update A set A.col1 = B.col2 FROM A,B WHERE A.ID = B.ID

 

--设置ID自增

id int identity(1,1)

ID自增的坏处是不能保证唯一性,无法在多个表或库中保持ID唯一不重复,因此在分布式式数据库和数据合并的时候不能使用ID自增。

不过ID自增在很多地方还是有妙用的。特别是sql server没有rownum这个属性的时候。

 

--取每年的最后一天

DECLARE @lastDay datetime
SET @lastDay = CONVERT(datetime,(SELECT CONVERT(char(5),GETDATE(),120)+'12-31'))

但我这里没判断闰年,懒  需要的可以在前面再根据年份判断一次

 

--单行转多行

SELECT

  id, substr( a.colnum_name, instr( a.colnum_name, '/', 1, levels.lvl ) + 1, instr( a.colnum_name, '/', 1, levels.lvl + 1 ) - ( instr( a.colnum_name, '/', 1, levels.lvl ) + 1 )) AS colnum_name

    FROM

  ( SELECT id, '/' || colnum_name || '/' AS colnum_name, length( colnum_name ) - nvl( length( REPLACE ( colnum_name, '/' )), 0 ) + 1 AS cnt

/*  

取待拆分字段每行按照分隔符','分割后的记录数,用于connect by

 

*/

  FROM table_name ) a, ( SELECT ROWNUM AS lvl

/*

产生一个待拆分字段分割后最大记录数的序列

 

*/

FROM ( SELECT MAX( length( colnum_name || '/' ) - nvl( length( REPLACE ( colnum_name, '/' )), 0 )) max_len FROM table_name ) CONNECT BY LEVEL <= max_len ) levels WHERE levels.lvl <= a.cnt

/*

笛卡尔连接

 */

 

ORDER BY id;