經典短小代碼收集

  經典短小代碼收集
SQL code
create table tz2008_1_1(id int,name varchar(50)) insert into tz2008_1_1 select 1,'a' create table tz2008_1_2(id int,name varchar(50)) insert into tz2008_1_2 select 2,'b' create table tz2008_1_3(id int,name varchar(50)) insert into tz2008_1_3 select 3,'c' declare @sql varchar(8000) select @sql=isnull(@sql+' union all ','')+' select * from ['+name+']' from sysobjects where xtype='u' and name like 'tz2008%' exec(@sql)



模糊表名的聯合查詢..

 

------------------------------------------------------------------------------------------------------------------------------------------------------------

SQL code
--查詢表的默認值 if object_id('tb') is not null drop table tb go create table tb(id int,name varchar(50) default 'abc',num int default 5) insert into tb(id) select 1 insert into tb select 1,'oo',100 insert into tb(id,name) select 1,'oo' go declare @tbname varchar(50) set @tbname='tb'--表名 select @tbname as tbname,c.name as colname,replace(replace(replace(replace(b.[text],'(''',''),''')',''),'((',''),'))','') as defaultvalue from sysconstraints a join syscomments b on a.constid=b.id join syscolumns c on a.id=c.id and a.colid=c.colid where a.id=object_id(@tbname) and object_name(a.constid) like '%df%'



----------------------------------------------------------------------------------------------------------------------------------------------

 

SQL code
--存儲過程語句查詢 if object_id('proc_ttt') is not null drop proc proc_ttt go create proc proc_ttt as select 1 union select 2 go select [text] from syscomments where id=object_id('proc_ttt') EXEC SP_HELPTEXT 'proc_ttt'
---------------------------------------------------------------------------------
 
SQL code
--通過身份證獲得戶籍 create function f_getcityfromcid (@cid varchar(18)) returns varchar(50) as begin declare @acity varchar(1000) set @acity = '____,____,____,____,____,____,____,____,____,____,____,北京__,天津__,河北__,山西__,內蒙古_,____,____,____,____,____,遼寧__,吉林__,黑龍江_,____,____,____,____,____,____,____,上海__,江蘇__,浙江__,安微__,福建__,江西__,山東__,____,____,____,河南__,湖北__,湖南__,廣東__,廣西__,海南__,____,____,____,重慶__,四川__,貴州__,雲南__,西藏__,____,____,____,____,____,____,陝西__,甘肅__,青海__,寧夏__,新疆__,____,____,____,____,____,臺灣__,____,____,____,____,____,____,____,____,____,香港__,澳門__,____,____,____,____,____,____,____,____,國外__,' set @cid = upper(@cid) IF (len(@cid) <> 18 OR patindex('%[^0-9X]%',@cid) > 0) RETURN '你小子騙我,這不是合法的身份證' IF substring(@acity,cast(left(@cid,2) as int)* 5+1,4) = '' RETURN '你小子騙我,這身份證的地區碼不存在' RETURN '這小子是:'+replace(substring(@acity,cast(left(@cid,2) as int)* 5+1,4),'_','') end go select dbo.f_getcityfromcid('32108519760502ttt9') /* -------------------------------------------------- 你小子騙我,這不是合法的身份證 (所影響的行數爲 1 行) */ select dbo.f_getcityfromcid('32108519****026**9') /* -------------------------------------------------- 這小子是:江蘇 (所影響的行數爲 1 行) */ drop function f_getcityfromcid
--------------------------------------------------------------------------------------
SQL code
--隨機選擇一個小於等於500的組合 declare @tb table(id int,num int) insert into @tb select 1,1000 insert into @tb select 2,100 insert into @tb select 3,500 insert into @tb select 4,200 insert into @tb select 5,200 insert into @tb select 6,50 insert into @tb select 7,150 insert into @tb select 8,80 insert into @tb select 9,70 declare @idtb table(id int) declare @num int,@id int,@sum int set @sum=0 while @sum<>500 begin select top 1 @id=id,@num=num from @tb where num<=500 order by newid() if @num=500 insert into @idtb select @id else if not exists(select 1 from @idtb where id=@id) insert into @idtb select @id select @sum=sum(num) from @tb where id in(select id from @idtb) if(@sum>500) begin delete @idtb end end select * from @tb where id in( select id from @idtb)
 
-----------------------------------------------------------------------------------
 
 
SQL code
/* 標題:普通行列轉換(version 2.0) 作者:愛新覺羅.毓華(十八年風雨,守得冰山雪蓮花開) 時間:2008-03-09 地點:廣東深圳 說明:普通行列轉換(version 1.0)僅針對sql server 2000提供靜態和動態寫法,version 2.0增加sql server 2005的有關寫法。 問題:假設有張學生成績表(tb)如下: 姓名 課程 分數 張三 語文 74 張三 數學 83 張三 物理 93 李四 語文 74 李四 數學 84 李四 物理 94 想變成(得到如下結果): 姓名 語文 數學 物理 ---- ---- ---- ---- 李四 74 84 94 張三 74 83 93 ------------------- */ create table tb(姓名 varchar(10) , 課程 varchar(10) , 分數 int) insert into tb values('張三' , '語文' , 74) insert into tb values('張三' , '數學' , 83) insert into tb values('張三' , '物理' , 93) insert into tb values('李四' , '語文' , 74) insert into tb values('李四' , '數學' , 84) insert into tb values('李四' , '物理' , 94) go --SQL SERVER 2000 靜態SQL,指課程只有語文、數學、物理這三門課程。(以下同) select 姓名 as 姓名 , max(case 課程 when '語文' then 分數 else 0 end) 語文, max(case 課程 when '數學' then 分數 else 0 end) 數學, max(case 課程 when '物理' then 分數 else 0 end) 物理 from tb group by 姓名 --SQL SERVER 2000 動態SQL,指課程不止語文、數學、物理這三門課程。(以下同) declare @sql varchar(8000) set @sql = 'select 姓名 ' select @sql = @sql + ' , max(case 課程 when ''' + 課程 + ''' then 分數 else 0 end) [' + 課程 + ']' from (select distinct 課程 from tb) as a set @sql = @sql + ' from tb group by 姓名' exec(@sql) --SQL SERVER 2005 靜態SQL。 select * from (select * from tb) a pivot (max(分數) for 課程 in (語文,數學,物理)) b --SQL SERVER 2005 動態SQL。 declare @sql varchar(8000) select @sql = isnull(@sql + '],[' , '') + 課程 from tb group by 課程 set @sql = '[' + @sql + ']' exec ('select * from (select * from tb) a pivot (max(分數) for 課程 in (' + @sql + ')) b') --------------------------------- /* 問題:在上述結果的基礎上加平均分,總分,得到如下結果: 姓名 語文 數學 物理 平均分 總分 ---- ---- ---- ---- ------ ---- 李四 74 84 94 84.00 252 張三 74 83 93 83.33 250 */ --SQL SERVER 2000 靜態SQL。 select 姓名 姓名, max(case 課程 when '語文' then 分數 else 0 end) 語文, max(case 課程 when '數學' then 分數 else 0 end) 數學, max(case 課程 when '物理' then 分數 else 0 end) 物理, cast(avg(分數*1.0) as decimal(18,2)) 平均分, sum(分數) 總分 from tb group by 姓名 --SQL SERVER 2000 動態SQL。 declare @sql varchar(8000) set @sql = 'select 姓名 ' select @sql = @sql + ' , max(case 課程 when ''' + 課程 + ''' then 分數 else 0 end) [' + 課程 + ']' from (select distinct 課程 from tb) as a set @sql = @sql + ' , cast(avg(分數*1.0) as decimal(18,2)) 平均分 , sum(分數) 總分 from tb group by 姓名' exec(@sql) --SQL SERVER 2005 靜態SQL。 select m.* , n.平均分 , n.總分 from (select * from (select * from tb) a pivot (max(分數) for 課程 in (語文,數學,物理)) b) m, (select 姓名 , cast(avg(分數*1.0) as decimal(18,2)) 平均分 , sum(分數) 總分 from tb group by 姓名) n where m.姓名 = n.姓名 --SQL SERVER 2005 動態SQL。 declare @sql varchar(8000) select @sql = isnull(@sql + ',' , '') + 課程 from tb group by 課程 exec ('select m.* , n.平均分 , n.總分 from (select * from (select * from tb) a pivot (max(分數) for 課程 in (' + @sql + ')) b) m , (select 姓名 , cast(avg(分數*1.0) as decimal(18,2)) 平均分 , sum(分數) 總分 from tb group by 姓名) n where m.姓名 = n.姓名') drop table tb ------------------ ------------------ /* 問題:如果上述兩表互相換一下:即表結構和數據爲: 姓名 語文 數學 物理 張三 74  83  93 李四 74  84  94 想變成(得到如下結果): 姓名 課程 分數 ---- ---- ---- 李四 語文 74 李四 數學 84 李四 物理 94 張三 語文 74 張三 數學 83 張三 物理 93 -------------- */ create table tb(姓名 varchar(10) , 語文 int , 數學 int , 物理 int) insert into tb values('張三',74,83,93) insert into tb values('李四',74,84,94) go --SQL SERVER 2000 靜態SQL。 select * from ( select 姓名 , 課程 = '語文' , 分數 = 語文 from tb union all select 姓名 , 課程 = '數學' , 分數 = 數學 from tb union all select 姓名 , 課程 = '物理' , 分數 = 物理 from tb ) t order by 姓名 , case 課程 when '語文' then 1 when '數學' then 2 when '物理' then 3 end --SQL SERVER 2000 動態SQL。 --調用系統表動態生態。 declare @sql varchar(8000) select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [課程] = ' + quotename(Name , '''') + ' , [分數] = ' + quotename(Name) + ' from tb' from syscolumns where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名爲姓名的其它列 order by colid asc exec(@sql + ' order by 姓名 ') --SQL SERVER 2005 動態SQL。 select 姓名 , 課程 , 分數 from tb unpivot (分數 for 課程 in([語文] , [數學] , [物理])) t --SQL SERVER 2005 動態SQL,同SQL SERVER 2000 動態SQL。 -------------------- /* 問題:在上述的結果上加個平均分,總分,得到如下結果: 姓名 課程 分數 ---- ------ ------ 李四 語文 74.00 李四 數學 84.00 李四 物理 94.00 李四 平均分 84.00 李四 總分 252.00 張三 語文 74.00 張三 數學 83.00 張三 物理 93.00 張三 平均分 83.33 張三 總分 250.00 ------------------ */ select * from ( select 姓名 as 姓名 , 課程 = '語文' , 分數 = 語文 from tb union all select 姓名 as 姓名 , 課程 = '數學' , 分數 = 數學 from tb union all select 姓名 as 姓名 , 課程 = '物理' , 分數 = 物理 from tb union all select 姓名 as 姓名 , 課程 = '平均分' , 分數 = cast((語文 + 數學 + 物理)*1.0/3 as decimal(18,2)) from tb union all select 姓名 as 姓名 , 課程 = '總分' , 分數 = 語文 + 數學 + 物理 from tb ) t order by 姓名 , case 課程 when '語文' then 1 when '數學' then 2 when '物理' then 3 when '平均分' then 4 when '總分' then 5 end drop table tb
----------------------------------------------------------------------------------------
 
SQL code
--按某一字段分組取最大(小)值所在行的數據 --(愛新覺羅.毓華(十八年風雨,守得冰山雪蓮花開) 2007-10-23於浙江杭州) /* 數據如下: name val memo a 2 a2(a的第二個值) a 1 a1--a的第一個值 a 3 a3:a的第三個值 b 1 b1--b的第一個值 b 3 b3:b的第三個值 b 2 b2b2b2b2 b 4 b4b4 b 5 b5b5b5b5b5 */ --創建表並插入數據: create table tb(name varchar(10),val int,memo varchar(20)) insert into tb values('a', 2, 'a2(a的第二個值)') insert into tb values('a', 1, 'a1--a的第一個值') insert into tb values('a', 3, 'a3:a的第三個值') insert into tb values('b', 1, 'b1--b的第一個值') insert into tb values('b', 3, 'b3:b的第三個值') insert into tb values('b', 2, 'b2b2b2b2') insert into tb values('b', 4, 'b4b4') insert into tb values('b', 5, 'b5b5b5b5b5') go --一、按name分組取val最大的值所在行的數據。 --方法1: select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name --方法2: select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val) --方法3: select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name --方法4: select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name --方法5 select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name /* name val memo ---------- ----------- -------------------- a 3 a3:a的第三個值 b 5 b5b5b5b5b5 */ --二、按name分組取val最小的值所在行的數據。 --方法1: select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name --方法2: select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val) --方法3: select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name --方法4: select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name --方法5 select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val < a.val) order by a.name /* name val memo ---------- ----------- -------------------- a 1 a1--a的第一個值 b 1 b1--b的第一個值 */ --三、按name分組取第一次出現的行所在的數據。 select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name /* name val memo ---------- ----------- -------------------- a 2 a2(a的第二個值) b 1 b1--b的第一個值 */ --四、按name分組隨機取一條數據。 select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name /* name val memo ---------- ----------- -------------------- a 1 a1--a的第一個值 b 5 b5b5b5b5b5 */ --五、按name分組取最小的兩個(N個)val select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val < a.val ) order by a.name,a.val select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val select a.* from tb a where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2) order by a.name /* name val memo ---------- ----------- -------------------- a 1 a1--a的第一個值 a 2 a2(a的第二個值) b 1 b1--b的第一個值 b 2 b2b2b2b2 */ --六、按name分組取最大的兩個(N個)val select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*) < 2) order by a.name /* name val memo ---------- ----------- -------------------- a 2 a2(a的第二個值) a 3 a3:a的第三個值 b 4 b4b4 b 5 b5b5b5b5b5 */ --七,如果整行數據有重複,所有的列都相同。 /* 數據如下: name val memo a 2 a2(a的第二個值) a 1 a1--a的第一個值 a 1 a1--a的第一個值 a 3 a3:a的第三個值 a 3 a3:a的第三個值 b 1 b1--b的第一個值 b 3 b3:b的第三個值 b 2 b2b2b2b2 b 4 b4b4 b 5 b5b5b5b5b5 */ --在sql server 2000中只能用一個臨時表來解決,生成一個自增列,先對val取最大或最小,然後再通過自增列來取數據。 --創建表並插入數據: create table tb(name varchar(10),val int,memo varchar(20)) insert into tb values('a', 2, 'a2(a的第二個值)') insert into tb values('a', 1, 'a1--a的第一個值') insert into tb values('a', 1, 'a1--a的第一個值') insert into tb values('a', 3, 'a3:a的第三個值') insert into tb values('a', 3, 'a3:a的第三個值') insert into tb values('b', 1, 'b1--b的第一個值') insert into tb values('b', 3, 'b3:b的第三個值') insert into tb values('b', 2, 'b2b2b2b2') insert into tb values('b', 4, 'b4b4') insert into tb values('b', 5, 'b5b5b5b5b5') go select * , px = identity(int,1,1) into tmp from tb select m.name,m.val,m.memo from ( select t.* from tmp t where val = (select min(val) from tmp where name = t.name) ) m where px = (select min(px) from ( select t.* from tmp t where val = (select min(val) from tmp where name = t.name) ) n where n.name = m.name) drop table tb,tmp /* name val memo ---------- ----------- -------------------- a 1 a1--a的第一個值 b 1 b1--b的第一個值 (2 行受影響) */ --在sql server 2005中可以使用row_number函數,不需要使用臨時表。 --創建表並插入數據: create table tb(name varchar(10),val int,memo varchar(20)) insert into tb values('a', 2, 'a2(a的第二個值)') insert into tb values('a', 1, 'a1--a的第一個值') insert into tb values('a', 1, 'a1--a的第一個值') insert into tb values('a', 3, 'a3:a的第三個值') insert into tb values('a', 3, 'a3:a的第三個值') insert into tb values('b', 1, 'b1--b的第一個值') insert into tb values('b', 3, 'b3:b的第三個值') insert into tb values('b', 2, 'b2b2b2b2') insert into tb values('b', 4, 'b4b4') insert into tb values('b', 5, 'b5b5b5b5b5') go select m.name,m.val,m.memo from ( select * , px = row_number() over(order by name , val) from tb ) m where px = (select min(px) from ( select * , px = row_number() over(order by name , val) from tb ) n where n.name = m.name) drop table tb /* name val memo ---------- ----------- -------------------- a 1 a1--a的第一個值 b 1 b1--b的第一個值 (2 行受影響) */
------------------------------------------------------------------------------------------
 
合併列值
原著:鄒建
改編:愛新覺羅.毓華(十八年風雨,守得冰山雪蓮花開)  2007-12-16  廣東深圳

表結構,數據如下:
id    value
----- ------
1    aa
1    bb
2    aaa
2    bbb
2    ccc

需要得到結果:
id    values
------ -----------
1      aa,bb
2      aaa,bbb,ccc
即:group by id, 求 value 的和(字符串相加)

1. 舊的解決方法(在sql server 2000中只能用函數解決。)
--1. 創建處理函數
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go

CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(8000)
AS
BEGIN
    DECLARE @r varchar(8000)
    SET @r = ''
    SELECT @r = @r + ',' + value FROM tb WHERE id=@id
    RETURN STUFF(@r, 1, 1, '')
END
GO

-- 調用函數
SELECt id, value = dbo.f_str(id) FROM tb GROUP BY id

drop table tb
drop function dbo.f_str

/*
id          value     
----------- -----------
1          aa,bb
2          aaa,bbb,ccc
(所影響的行數爲 2 行)
*/

--2、另外一種函數.
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go

--創建一個合併的函數
create function f_hb(@id int)
returns varchar(8000)
as
begin
  declare @str varchar(8000)
  set @str = ''
  select @str = @str + ',' + cast(value as varchar) from tb where id = @id
  set @str = right(@str , len(@str) - 1)
  return(@str)
End
go

--調用自定義函數得到結果:
select distinct id ,dbo.f_hb(id) as value from tb

drop table tb
drop function dbo.f_hb

/*
id          value     
----------- -----------
1          aa,bb
2          aaa,bbb,ccc
(所影響的行數爲 2 行)
*/

2. 新的解決方法(在sql server 2005中用OUTER APPLY等解決。)
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
-- 查詢處理
SELECT * FROM(SELECT DISTINCT id FROM tb)A OUTER APPLY(
        SELECT [values]= STUFF(REPLACE(REPLACE(
            (
                SELECT value FROM tb N
                WHERE id = A.id
                FOR XML AUTO
            ), ' <N value="', ','), '"/>', ''), 1, 1, '')
)N
drop table tb

/*
id          values
----------- -----------
1          aa,bb
2          aaa,bbb,ccc

(2 行受影響)
*/

--SQL2005中的方法2
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go

select id, [values]=stuff((select ','+[value] from tb t where id=tb.id for xml path('')), 1, 1, '')
from tb
group by id

/*
id          values
----------- --------------------
1          aa,bb
2          aaa,bbb,ccc

(2 row(s) affected)

*/

drop table tb
----------------------------------------------------------------------------------------
 
分拆列值 

原著:鄒建
改編:愛新覺羅.毓華(十八年風雨,守得冰山雪蓮花開)  2007-12-16  廣東深圳

有表tb, 如下:
id          value
----------- -----------
1          aa,bb
2          aaa,bbb,ccc
欲按id,分拆value列, 分拆後結果如下:
id          value
----------- --------
1          aa
1          bb
2          aaa
2          bbb
2          ccc

1. 舊的解決方法(sql server 2000)
SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b

SELECT A.id, SUBSTRING(A.[values], B.id, CHARINDEX(',', A.[values] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[values], B.id, 1) = ','

DROP TABLE #

2. 新的解決方法(sql server 2005)

create table tb(id int,value varchar(30))
insert into tb values(1,'aa,bb')
insert into tb values(2,'aaa,bbb,ccc')
go
SELECT A.id, B.value
FROM(
    SELECT id, [value] = CONVERT(xml,' <root> <v>' + REPLACE([value], ',', ' </v> <v>') + ' </v> </root>') FROM tb
)A
OUTER APPLY(
    SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
)B

DROP TABLE tb

/*
id          value
----------- ------------------------------
1          aa
1          bb
2          aaa
2          bbb
2          ccc

(5 行受影響)
*/
 
-------------------------------------------------------------------------------------------
 
SQL code
日期的推算:(轉鄒老大的代碼) DECLARE @dt datetime SET @dt=GETDATE() DECLARE @number int SET @number=3 --1.指定日期該年的第一天或最後一天 --A. 年的第一天 SELECT CONVERT(char(5),@dt,120)+ '1-1 ' --B. 年的最後一天 SELECT CONVERT(char(5),@dt,120)+ '12-31 ' --2.指定日期所在季度的第一天或最後一天 --A. 季度的第一天 SELECT CONVERT(datetime, CONVERT(char(8), DATEADD(Month, DATEPART(Quarter,@dt)*3-Month(@dt)-2, @dt), 120)+ '1 ') --B. 季度的最後一天(CASE判斷法) SELECT CONVERT(datetime, CONVERT(char(8), DATEADD(Month, DATEPART(Quarter,@dt)*3-Month(@dt), @dt), 120) +CASE WHEN DATEPART(Quarter,@dt) in(1,4) THEN '31 'ELSE '30 ' END) --C. 季度的最後一天(直接推算法) SELECT DATEADD(Day,-1, CONVERT(char(8), DATEADD(Month, 1+DATEPART(Quarter,@dt)*3-Month(@dt), @dt), 120)+ '1 ') --3.指定日期所在月份的第一天或最後一天 --A. 月的第一天 SELECT CONVERT(datetime,CONVERT(char(8),@dt,120)+ '1 ') --B. 月的最後一天 SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+ '1 ') --C. 月的最後一天(容易使用的錯誤方法) SELECT DATEADD(Month,1,DATEADD(Day,-DAY(@dt),@dt)) --4.指定日期所在周的任意一天 SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt) --5.指定日期所在周的任意星期幾 --A. 星期天做爲一週的第1天 SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt) --B. 星期一做爲一週的第1天 SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt) ----------------------------------------------------------------------------------
 
SQL code
/* 標題:分解字符串並查詢相關數據 作者:愛新覺羅.毓華(十八年風雨,守得冰山雪蓮花開) 時間:2008-03-18 地點:廣東深圳 說明:通過使用函數等方法分解字符串查詢相關數據。 問題:通過分解一個帶某種符號分隔的字符串在數據庫中查找相關數據。 例如 @str = '1,2,3',查詢下表得到記錄1,4,5,6 ID TypeID 1 1,2,3,4,5,6,7,8,9,10,11,12 2 2,3 3 3,7,8,9 4 2,6 5 4,5 6 6,7 */ ----------------------------- create table tb (ID int , TypeID varchar(30)) insert into tb values(1 , '1,2,3,4,5,6,7,8,9,10,11,12') insert into tb values(2 , '2,3') insert into tb values(3 , '3,7,8,9') insert into tb values(4 , '2,6') insert into tb values(5 , '4,5') insert into tb values(6 , '6,7') go ----------------------------- --如果僅僅是一個,如@str = '1'. declare @str as varchar(30) set @str = '1' select * from tb where charindex(',' + @str + ',' , ',' + TypeID + ',') > 0 select * from tb where ',' + TypeID + ',' like '%,' + @str + ',%' /* ID TypeID ----------- ------------------------------ 1 1,2,3,4,5,6,7,8,9,10,11,12 (所影響的行數爲 1 行) */ ----------------------------- --如果包含兩個,如@str = '1,2'. declare @str as varchar(30) set @str = '1,2' select * from tb where charindex(',' + left(@str , charindex(',' , @str) - 1) + ',' , ',' + typeid + ',') > 0 or charindex(',' + substring(@str , charindex(',' , @str) + 1 , len(@str)) + ',' , ',' + typeid + ',') > 0 select * from tb where ',' + typeid + ',' like '%,' + left(@str , charindex(',' , @str) - 1) + ',%' or ',' + typeid + ',' like '%,' + substring(@str , charindex(',' , @str) + 1 , len(@str)) + ',%' /* ID TypeID ----------- ------------------------------ 1 1,2,3,4,5,6,7,8,9,10,11,12 2 2,3 4 2,6 (所影響的行數爲 3 行) */ ------------------------------------------- --如果包含三個或四個,用PARSENAME函數來處理. declare @str as varchar(30) set @str = '1,2,3,4' select * from tb where charindex(',' + parsename(replace(@str , ',' , '.') , 4) + ',' , ',' + typeid + ',') > 0 or charindex(',' + parsename(replace(@str , ',' , '.') , 3) + ',' , ',' + typeid + ',') > 0 or charindex(',' + parsename(replace(@str , ',' , '.') , 2) + ',' , ',' + typeid + ',') > 0 or charindex(',' + parsename(replace(@str , ',' , '.') , 1) + ',' , ',' + typeid + ',') > 0 select * from tb where ',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 4) + ',%' or ',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 3) + ',%' or ',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 2) + ',%' or ',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 1) + ',%' /* ID TypeID ----------- ------------------------------ 1 1,2,3,4,5,6,7,8,9,10,11,12 2 2,3 3 3,7,8,9 4 2,6 5 4,5 (所影響的行數爲 5 行) */ --------------------------------------- --如果超過四個,則只能使用函數或動態SQL來分解並查詢數據。 /* 名稱:fn_split函數. 功能:實現字符串分隔功能的函數 */ create function dbo.fn_split(@inputstr varchar(8000), @seprator varchar(10)) returns @temp table (a varchar(200)) as begin declare @i int set @inputstr = rtrim(ltrim(@inputstr)) set @i = charindex(@seprator , @inputstr) while @i >= 1 begin insert @temp values(left(@inputstr , @i - 1)) set @inputstr = substring(@inputstr , @i + 1 , len(@inputstr) - @i) set @i = charindex(@seprator , @inputstr) end if @inputstr <> '/' insert @temp values(@inputstr) return end go --調用 declare @str as varchar(30) set @str = '1,2,3,4,5' select distinct m.* from tb m, (select * from dbo.fn_split(@str,',')) n where charindex(',' + n.a + ',' , ',' + m.typeid + ',') > 0 drop table tb drop function dbo.fn_split /* ID TypeID ----------- ------------------------------ 1 1,2,3,4,5,6,7,8,9,10,11,12 2 2,3 3 3,7,8,9 4 2,6 5 4,5 (所影響的行數爲 5 行) */ ------------------------------------------ --使用動態SQL的語句。 declare @str varchar(200) declare @sql as varchar(1000) set @str = '1,2,3,4,5' set @sql = 'select ''' + replace(@str , ',' , ''' as id union all select ''') set @sql = @sql + '''' set @sql = 'select distinct a.* from tb a , (' + @sql + ') b where charindex(' + ''','' + b.id + ' + ''',''' + ' , ' + ''','' + a.typeid + ' + ''',''' + ') > 0 ' exec (@sql) /* ID TypeID ----------- ------------------------------ 1 1,2,3,4,5,6,7,8,9,10,11,12 2 2,3 3 3,7,8,9 4 2,6 5 4,5 (所影響的行數爲 5 行) */
--------------------------------------------------------------------------------------------
 
SQL code
/* 本文由微軟新聞組摘錄下來的。一段非常有用的腳本。 如果碰到日誌文件過大的問題,用SHIRNK DATABASE, TRUNCATE LOG FILE不是很有效時,可以考慮試下下面的腳本。把代碼COPY到查詢分析器裏,然後修改其中的3個參數(數據庫名,日誌文件名,和目標日誌文件的大小),運行即可 */ ---------------------------------------------------------------------------------- SET NOCOUNT ON DECLARE @LogicalFileName sysname, --日誌文件名 @MaxMinutes INT, --允許此腳本執行的最長時間 @NewSize INT --目標日誌文件的大小 USE CRM -- 要操作的數據庫名 SELECT @LogicalFileName = 'CRM_LOG', -- 日誌文件名 @MaxMinutes = 10, -- Limit on time allowed to wrap log. @NewSize = 1 -- 想要收縮到的目標大小(單位M),此處標記收縮到1M DECLARE @OriginalSize int SELECT @OriginalSize = size FROM sysfiles WHERE name = @LogicalFileName SELECT 'Original Size of ' + db_name() + ' LOG is ' + CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' FROM sysfiles WHERE name = @LogicalFileName CREATE TABLE DummyTrans(DummyColumn char (8000) not null) DECLARE @Counter INT, @StartTime DATETIME, @TruncLog VARCHAR(255) SELECT @StartTime = GETDATE(), @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' DBCC SHRINKFILE (@LogicalFileName, @NewSize) EXEC (@TruncLog) -- Wrap the log if necessary. WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) AND (@OriginalSize * 8 /1024) > @NewSize BEGIN -- Outer loop. SELECT @Counter = 0 WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) BEGIN -- update INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans SELECT @Counter = @Counter + 1 END EXEC (@TruncLog) END SELECT 'Final Size of ' + db_name() + ' LOG is ' + CONVERT(VARCHAR(30),size) + ' 8K pages or ' + CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' FROM sysfiles WHERE name = @LogicalFileName DROP TABLE DummyTrans SET NOCOUNT OFF ----------------------------------------------------------------------------------------------
 
SQL code
--遞歸刪除父節點及所有子節點 create table tb(Id int, ParentId int, Name varchar(5)) insert into tb select 1, 0, 'a1' union all select 2,2, 'a2' union all select 14, 1, 'b11' union all select 15, 1, 'b12' union all select 16, 14, 'c13' union all select 17, 14, 'c14' union all select 104,17,'d15' go WITH temptab(id, parentid, name) AS ( SELECT root.id, root.parentid, root.name FROM tb root WHERE id=1 UNION ALL SELECT sub.id, sub.parentid, sub.name FROM tb sub, temptab super WHERE sub.parentid = super.id ) delete from tb where id in( select id from temptab ) select * from tb go drop table tb /* Id ParentId Name ----------- ----------- ----- 2 2 a2
 
-----------------------------------------------------------------------------------------------
 
精妙SQL語句 

明:複製表(只複製結構,源表名:a 新表名:b)
SQL: select * into b from a where 1 <>1

說明:拷貝表(拷貝數據,源表名:a 目標表名:b)
SQL: insert into b(a, b, c) select d,e,f from b;

說明:顯示文章、提交人和最後回覆時間
SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

說明:外連接查詢(表名1:a 表名2:b)
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

說明:日程安排提前五分鐘提醒
SQL: select * from 日程安排 where datediff( <|>minute <|>,f開始時間,getdate())>5


說明:兩張關聯表,刪除主表中已經在副表中沒有的信息
SQL:
delete from info where not exists ( select * from infobz where info.infid=infobz.infid )

說明:--
SQL:
SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE
FROM TABLE1,
(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE
FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE, <|>YYYY/MM <|>) = TO_CHAR(SYSDATE, <|>YYYY/MM <|>)) X,
(SELECT NUM, UPD_DATE, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE, <|>YYYY/MM <|>) =
TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, <|>YYYY/MM <|>) || <|>/01 <|>, <|>YYYY/MM/DD <|>) - 1, <|>YYYY/MM <|>) ) Y,
WHERE X.NUM = Y.NUM (+)
AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B
WHERE A.NUM = B.NUM

說明:--
SQL:
select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名稱= <|>"&strdepartmentname&" <|> and 專業名稱= <|>"&strprofessionname&" <|> order by 性別,生源地,高考總成績

說明:
從數據庫中去一年的各單位電話費統計(電話費定額賀電化肥清單兩個表來源)
SQL:
SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, <|>yyyy <|>) AS telyear,
SUM(decode(TO_CHAR(a.telfeedate, <|>mm <|>), <|>01 <|>, a.factration)) AS JAN,
SUM(decode(TO_CHAR(a.telfeedate, <|>mm <|>), <|>02 <|>, a.factration)) AS FRI,
SUM(decode(TO_CHAR(a.telfeedate, <|>mm <|>), <|>03 <|>, a.factration)) AS MAR,
SUM(decode(TO_CHAR(a.telfeedate, <|>mm <|>), <|>04 <|>, a.factration)) AS APR,
SUM(decode(TO_CHAR(a.telfeedate, <|>mm <|>), <|>05 <|>, a.factration)) AS MAY,
SUM(decode(TO_CHAR(a.telfeedate, <|>mm <|>), <|>06 <|>, a.factration)) AS JUE,
SUM(decode(TO_CHAR(a.telfeedate, <|>mm <|>), <|>07 <|>, a.factration)) AS JUL,
SUM(decode(TO_CHAR(a.telfeedate, <|>mm <|>), <|>08 <|>, a.factration)) AS AGU,
SUM(decode(TO_CHAR(a.telfeedate, <|>mm <|>), <|>09 <|>, a.factration)) AS SEP,
SUM(decode(TO_CHAR(a.telfeedate, <|>mm <|>), <|>10 <|>, a.factration)) AS OCT,
SUM(decode(TO_CHAR(a.telfeedate, <|>mm <|>), <|>11 <|>, a.factration)) AS NOV,
SUM(decode(TO_CHAR(a.telfeedate, <|>mm <|>), <|>12 <|>, a.factration)) AS DEC
FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration
FROM TELFEESTAND a, TELFEE b
WHERE a.tel = b.telfax) a
GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, <|>yyyy <|>)

說明:四表聯查問題:
SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

說明:得到表中最小的未使用的ID號
SQL:
SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID
FROM Handle
WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)
 
-----------------------------------------------------------------------------------------------
 
 
不足5位數補零的方法 
public string getNumberString(int n)
{
    if(n.ToString().Length <5)
    {
        return (1000000+n).ToString().SubString(1);
    }
    return n.ToString();
}
 
--------------------------------------------------------------------------------------
 
ip各段內容提取,類似有3或4段字串通過一特殊字符連接的字串提取 
-----------------------------------
declare @a varchar(50)
set @a='192.168.1.123'
SELECT PARSENAME(@a,1),PARSENAME(@a,2),PARSENAME(@a,3),PARSENAME(@a,4)
set @a='100,200,300'
SELECT PARSENAME(replace(@a,',','.'),1)高,PARSENAME(replace(@a,',','.'),2)寬
,PARSENAME(replace(@a,',','.'),3)長
 
----------------------------------------------------------------------------------------------
 
--備份 
declare  @sql  varchar(8000) 
set  @sql='backup  database  mis    to  disk=''d:/databack/mis/mis' 
+rtrim(convert(varchar,getdate(),112))+'.bak''' 
exec(@sql)   
--刪除15天前備份文件 
set  @sql='del  d:/databack/mis/mis' 
+rtrim(convert(varchar,getdate()-15,112))+'.bak''' 
exec  master..xp_cmdshell  @sql
 
-----------------------------------------------------------------------------------------------
 
求字串中所含某字符或某子串的個數 
declare @a varchar(100),@b varchar(20)
select @a='abcdefbcmnbcde',@b='bc'
select (len(@a)-len(replace(@a,@b,'')))/len(@b)
 
-----------------------------------------------------------------------------------------------
 
對查詢結果進行隨機排序 
select  * from dbo.Class order by newid()
 
-----------------------------------------------------------------------------------------------
 
*--比較兩個數據庫的表結構差異 

--*/
/*--調用示例

exec p_comparestructure 'xzkh_model','xzkh_new'
--*/

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_comparestructure]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_comparestructure]
GO

create proc p_comparestructure
@dbname1 varchar(250), --要比較的數據庫名1
@dbname2 varchar(250) --要比較的數據庫名2
as
create table #tb1(表名1 varchar(250),字段名 varchar(250),序號 int,標識 bit,主鍵 bit,類型 varchar(250),
佔用字節數 int,長度 int,小數位數 int,允許空 bit,默認值 varchar(500),字段說明 varchar(500))

create table #tb2(表名2 varchar(250),字段名 varchar(250),序號 int,標識 bit,主鍵 bit,類型 varchar(250),
佔用字節數 int,長度 int,小數位數 int,允許空 bit,默認值 varchar(500),字段說明 varchar(500))

--得到數據庫1的結構
exec('insert into #tb1 SELECT
表名=d.name,字段名=a.name,序號=a.colid,
標識=case when a.status=0x80 then 1 else 0 end,
主鍵=case when exists(SELECT 1 FROM '+@dbname1+'..sysobjects where xtype=''PK'' and name in (
  SELECT name FROM '+@dbname1+'..sysindexes WHERE indid in(
  SELECT indid FROM '+@dbname1+'..sysindexkeys WHERE id = a.id AND colid=a.colid
  ))) then 1 else 0 end,
類型=b.name, 佔用字節數=a.length,長度=a.prec,小數位數=a.scale, 允許空=a.isnullable,
默認值=isnull(e.text,''''''),字段說明=isnull(g.[value],'''''')
FROM '+@dbname1+'..syscolumns a
left join '+@dbname1+'..systypes b on a.xtype=b.xusertype
inner join '+@dbname1+'..sysobjects d on a.id=d.id  and d.xtype=''U'' and  d.name <>''dtproperties''
left join '+@dbname1+'..syscomments e on a.cdefault=e.id
left join '+@dbname1+'..sysproperties g on a.id=g.id and a.colid=g.smallid 
order by a.id,a.colorder')

--得到數據庫2的結構
exec('insert into #tb2 SELECT
表名=d.name,字段名=a.name,序號=a.colid,
標識=case when a.status=0x80 then 1 else 0 end,
主鍵=case when exists(SELECT 1 FROM '+@dbname2+'..sysobjects where xtype=''PK'' and name in (
  SELECT name FROM '+@dbname2+'..sysindexes WHERE indid in(
  SELECT indid FROM '+@dbname2+'..sysindexkeys WHERE id = a.id AND colid=a.colid
  ))) then 1 else 0 end,
類型=b.name, 佔用字節數=a.length,長度=a.prec,小數位數=a.scale, 允許空=a.isnullable,
默認值=isnull(e.text,''''''),字段說明=isnull(g.[value],'''''')
FROM '+@dbname2+'..syscolumns a
left join '+@dbname2+'..systypes b on a.xtype=b.xusertype
inner join '+@dbname2+'..sysobjects d on a.id=d.id  and d.xtype=''U'' and  d.name <>''dtproperties''
left join '+@dbname2+'..syscomments e on a.cdefault=e.id
left join '+@dbname2+'..sysproperties g on a.id=g.id and a.colid=g.smallid 
order by a.id,a.colorder')
--and not exists(select 1 from #tb2 where 表名2=a.表名1)
select 比較結果=case when a.表名1 is null and b.序號=1 then '庫1缺少表:'+b.表名2
  when b.表名2 is null and a.序號=1 then '庫2缺少表:'+a.表名1
  when a.字段名 is null and exists(select 1 from #tb1 where 表名1=b.表名2) then '庫1 ['+b.表名2+'] 缺少字段:'+b.字段名
  when b.字段名 is null and exists(select 1 from #tb2 where 表名2=a.表名1) then '庫2 ['+a.表名1+'] 缺少字段:'+a.字段名
  when a.標識 <>b.標識 then '標識不同'
  when a.主鍵 <>b.主鍵 then '主鍵設置不同'
  when a.類型 <>b.類型 then '字段類型不同'
  when a.佔用字節數 <>b.佔用字節數 then '佔用字節數'
  when a.長度 <>b.長度 then '長度不同'
  when a.小數位數 <>b.小數位數 then '小數位數不同'
  when a.允許空 <>b.允許空 then '是否允許空不同'
  when a.默認值 <>b.默認值 then '默認值不同'
  when a.字段說明 <>b.字段說明 then '字段說明不同'
else '' end,
*
from #tb1 a
full join #tb2 b on a.表名1=b.表名2 and a.字段名=b.字段名
where a.表名1 is null or a.字段名 is null or b.表名2 is null or b.字段名 is null
or a.標識 <>b.標識 or a.主鍵 <>b.主鍵 or a.類型 <>b.類型
or a.佔用字節數 <>b.佔用字節數 or a.長度 <>b.長度 or a.小數位數 <>b.小數位數
or a.允許空 <>b.允許空 or a.默認值 <>b.默認值 or a.字段說明 <>b.字段說明
order by isnull(a.表名1,b.表名2),isnull(a.序號,b.序號)--isnull(a.字段名,b.字段名)
go
 
--------------------------------------------------------------------------------------------
 
SQL code
--查看數據庫中所有的表 sp_MSforeachtable 'Select Top 1 * From ?' --所有數據庫的 sp_MSforeachdb
---------------------------------------------------------------------------------------------
 
SQL code
select @@version
----------------------------------------------------------------------------------------------
 
SQL code
--功能概述:重新編譯一個表上的所有索引 alter index all on order_master rebuild
 
-----------------------------------------------------------------------------------------------
 
SQL code
--功能概述:顯示某一表的結構 DECLARE @tableName nvarchar(100) SET @tableName ='brand' --mssql2005 SELECT ( CASE WHEN a.colorder=1 THEN d.name ELSE '' END)表名, a.colorder 字段序號, a.name 字段名, (CASE WHEN COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 THEN '' ELSE '' END) 標識, (CASE WHEN ( SELECT COUNT(*) FROM sysobjects WHERE (name IN (SELECT name FROM sysindexes WHERE (id = a.id) AND (indid IN (SELECT indid FROM sysindexkeys WHERE (id = a.id) AND (colid IN (SELECT colid FROM syscolumns WHERE (id = a.id) AND (name = a.name))))))) AND (xtype = 'PK'))>0 THEN '' ELSE '' END) 主鍵, b.name 類型, a.length 佔用字節數, COLUMNPROPERTY(a.id,a.name,'PRECISION') AS 長度, ISNULL(COLUMNPROPERTY(a.id,a.name,'Scale'),0) AS 小數位數, (CASE WHEN a.isnullable=1 THEN '' ELSE '' END) 允許空, ISNULL(e.text,'') 默認值, ISNULL(g.[value],'') AS 字段說明 FROM syscolumns a LEFT JOIN systypes b ON a.xtype=b.xusertype INNER JOIN sysobjects d ON a.id=d.id AND d.xtype='U' AND d.name <>'dtproperties' LEFT JOIN syscomments e ON a.cdefault=e.id LEFT JOIN sys.extended_properties g ON a.id=g.major_id AND a.colid = g.major_id WHERE d.name=@tableName ORDER BY a.id,a.colorder
-----------------------------------------------------------------------------------------------
 
1、說明:複製表(只複製結構,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1 <>1
法二:select top 0 * into b from a

2、說明:拷貝表(拷貝數據,源表名:a 目標表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;

3、說明:跨數據庫之間表的拷貝(具體數據使用絕對路徑) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具體數據庫’ where 條件
例子:..from b in '"&Server.MapPath(".")&"/data.mdb" &"' where..

4、說明:子查詢(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

5、說明:顯示文章、提交人和最後回覆時間
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6、說明:外連接查詢(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、說明:在線視圖查詢(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;

8、說明:between的用法,between限制查詢數據範圍時包括了邊界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 數值1 and 數值2

9、說明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

10、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

11、說明:四表聯查問題:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

12、說明:日程安排提前五分鐘提醒
SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5

13、說明:一條sql 語句搞定數據庫分頁
select top 10 b.* from (select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段

14、說明:前10條記錄
select top 10 * form table1 where 範圍

15、說明:選擇在每一組b值相同的數據中對應的a最大的記錄的所有信息(類似這樣的用法可以用於論壇每月排行榜,每月熱銷產品分析,按科目成績排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行並消除所有重複行而派生出一個結果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)

17、說明:隨機取出10條數據
select top 10 * from tablename order by newid()

18、說明:隨機選擇記錄
select newid()

19、說明:刪除重複記錄
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

20、說明:列出數據庫裏所有的表名
select name from sysobjects where type='U'

21、說明:列出表裏的所有的
select name from syscolumns where id=object_id('TableName')

22、說明:列示type、vender、pcs字段,以type字段排列,case可以方便地實現多重選擇,類似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
顯示結果:
type vender pcs
電腦 A 1
電腦 A 1
光盤 B 2
光盤 A 2
手機 B 3
手機 C 3

23、說明:初始化表table1
TRUNCATE TABLE table1

24、說明:選擇從10到15的記錄
select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc
 
 
 
 
 
 
 
 
 
 
 
-----------------------------------------------------------------------------------------------
 

SQL code
--改變用戶的鎖定狀態 (可適合一切 bit 類型的字段) UPDATE tb_Table SET IsLook=Abs(IsLook-1) WHERE Id=@id
-----------------------------------------------------------------------------------------------
 
/* 
08.09.20

知識點:SQL函數主要分爲兩中類型 1.單行函數(也叫標量函數) 2.多行函數
標量函數:對單一值操作,返回單一值。只要表達式有效即可使用標量函數。

我們把標量函數的分類列出來:
配置函數      返回當前配置信息
遊標函數       返回遊標信息
日期和時間函數  對日期和時間輸入值進行操作,返回一個字符串、數字或日期和時間值
數學函數      對作爲函數參數提供的輸入值進行計算,返回一個數字值
元數據函數    返回有關數據庫和數據庫對象的信息
安全函數      返回有關用戶和角色的信息
字符串函數    對字符串(char或varchar)輸入值執行操作,返回一個字符串或數字值
系統函數      執行操作並返回有關Microsoft SQL Server中的值、對象和設置的信息
系統統計函數  返回系統的統計信息
文本和圖象函數  對文本或圖象進行操作並返回有關信息

聚合函數 是對一組值進行操作,跟標量函數不同.
行集函數 是可以向SQL語句中表引用一樣使用,具體看文檔了....
下面具體看例子了
*/

select emp_id,UPPER(lname),job_id
from employee
where lname='chang'
/*大小寫處理函數*/
select emp_id,LOWER(lname),job_id
from employee
where lname='chang'

select emp_id,fname+lname NAME,  /*使用字符處理函數*/
job_id,LEN(lname) Length,
CHARINDEX('a',lname)"Contains 'a'?"
from employee
where SUBSTRING(emp_id,1,2)='MA'
/*
運算符 + :連接值在一起
substring :選取給定位置和長度的子字符串
len  :以數字值顯示一個字符串的長度
charIndex  :找到一個給定字符的數字位置
Replicate  :用給定的字符替換給定長度的字符串
Ltrim和Rtrim  :從一個字符串中去除頭或尾的字符
*/

select ROUND(2008.092023,2),/*數字函數ROUND四捨五入*/
ROUND(2008.092023,0),
ROUND(2008.092023,-1)
/*注意奇數偶數的進位不同 它也可以用語日期函數處理*/

select lname,job_lvl,job_lvl%50/*使用%(模)函數 經常用與確定一個值是奇數還是偶數*/
from employee
where job_lvl=5

select lname,hire_date/*日期的使用*/
from employee
where lname like 'A%'

select lname,hire_date+365 AS "One Year"/*用日期做算術運算 該例顯示所有job_id=10的僱員的名字和其受僱滿一年的日期*/
from employee
where job_id=10

select lname,  /*CONVERT函數用於日期轉換*/
CONVERT(varchar(10),hire_date,20)
AS HIREDATE
from employee

select SUBSTRING(title,1,30) AS Title,ytd_sales/*對數字使用CAST函數*/
from titles
where CAST(ytd_sales AS char(20)) LIKE '3%'
/*
檢索書名:這些圖書的截止當前銷售額的第一數字爲3,並將這些圖書的ytd_sales轉換爲char(20)
CAST(number,數據類型)
*/

select CONVERT(varchar(10),price,0) PRICE/*對數字使用CONVERT函數*/
from titles
where title_id='BU1111'

select CAST('2008-09-20 23:57' AS datetime)
/*使用CAST或CONVERT函數轉換字符串到日期*/
select CONVERT(datetime,'2008-09-20 23:59')

select title,ytd_sales/*使用帶有LIKE子句的CAST*/
from titles
where
CAST(ytd_sales AS char(20)) LIKE '15%'
AND type='trad_cook'

select title,ISNULL(price,0) Price,/*使用ISNULL函數*/
ISNULL(price*12,0) 'Ten Price'
from titles
/*爲了計算所有圖書的價格,在進行算術運算之前必須轉換空值爲一個數,ISNULL函數用來轉換空值爲零*/


select                      /*使用CASE表達式*/
CASE
when price IS NULL THEN 'Not yet priced'
when price <10 THEN 'Very Reasonable Title'
when price>=10 and price <20 THEN 'Coffee Table Title'
else 'Expensive book!'
END AS 'Price Category',  /*這個逗號不敢忘*/
CONVERT(varchar(20),title) AS "shorttened Title"
from pubs.dbo.titles
ORDER BY price
/*
使用CASE表達式使得if-then-else條件判斷很容易實現
*/



select          /*使用CASE處理條件數據*/
CASE type
when 'popular_comp' then 'Popular Computing'
when 'mod_cook' then 'Modern Coking'
        when 'business' then 'Business'
when 'psychology' then 'Psychology'
when 'trad_cook' then 'Traditional Cooking'
else 'Not yet categorized'
END AS Category,
CONVERT(varchar(30),titles) AS "Shortened Title",
Price AS price
from titles
where price IS NOT NULL
ORDER BY 1


/*
小結下:掌握用函數對數據的計算
用函數修飾不同的數據項
用函數改變數據格式
用函數改變列數據類型
使用ISNULL函數
使用if-then-else邏輯
*/
/*最後一個例子有問題先不管了掌握語法就OK*/
 
-----------------------------------------------------------------------------------------------
 
SQL code
/*08.09.20*/ select * from employee use master /*顯示錶結構*/ exec sp_helpdb GO use pubs exec sp_help GO use pubs exec sp_help employee GO select lname,job_lvl from employee where job_lvl<=50 select lname,job_lvl/*使用BETWEEN條件*/ from employee where job_lvl BETWEEN 100 AND 200 select lname,job_id,job_lvl/*使用IN成員條件測試在列表中的值*/ from employee where job_lvl IN (100,170,200) select emp_id,lname,job_id,job_lvl/*使用NOT操作*/ from employee where job_lvl NOT IN(100,170,200) select title_id,title,type,price from titles where price IS NULL select lname,job_lvl,job_lvl/*優先規則AND在前*/ from employee where job_lvl=5 OR job_lvl=7 AND job_lvl>160 select lname,job_lvl,job_lvl/*用圓括號強制優先權*/ from employee where (job_lvl=5 OR job_lvl=7) AND job_lvl>160 select lname,job_id,job_lvl,hire_date/*用ORDER BY子句進行排序(升序排列)*/ from employee ORDER BY hire_date select lname,job_id,job_lvl,hire_date/*用DESC降序排列*/ from employee ORDER BY hire_date DESC select emp_id,lname,job_lvl*2 "Double job_lvl"/*用列別名排序*/ from employee ORDER BY "Double job_lvl" select lname,job_id,job_lvl/*多列排序*/ from employee ORDER BY job_id,job_lvl DESC /* 小結下:主要掌握WHERE子句限制輸出行 使用比較條件 使用BETWEEN,IN,AND,NOT,OR操作 最後掌握使用ORDER BY子句排序輸出行 所有操作在數據庫pubs裏進行 */
-----------------------------------------------------------------------------------------------
 
SQL code
/* 標題:日期分表查詢(version 1.0) 網名:懸崖邊的舞者 時間:2008-07-14 地點:天津 說明:以日期或月份分表進行多日、多月查詢連表查詢的有關寫法 */ Create Procedure Search @date1 datetime, --起始時間 @date2 datetime --終止時間 as declare @date1New datetime, @rq varchar(6), @i int , --記錄循環次數 @s varchar(5000) --根據表多少 可以擴大它 set @rq=convert(varchar,@date1,12) --把時間格式化 比如2008-06-20 變成了080620 set @s='select * from sensor'+@rq --初始化 @s='select * from sensor080620' 這樣第一個表就有了 set @i=datediff(d,@date1,@date2) --日期相減 while @i>0 begin --如果是非常重要的系統可以在這裏加上該物理表是否存在的語句 --if exists(select * from dbo.sysobjects where --id = object_id(N'c') and OBJECTPROPERTY(id,N'IsUserTable')=1) --begin --SELECT '存在 ' --end set @date1New= dateadd(day,@i,@date1) set @rq=convert(varchar,@date1New,12) --如果是按月進行查詢 就修改上面 set @s= @s+' union all select * from sensor'+@rq set @i=@i-1 --累加 end select @s --exec(@S) go exec Search '2008-06-20 00:11:11.000','2008-07-25 00:11:11.000' drop Procedure Search
-----------------------------------------------------------------------------------------------
 
SQL code
create table tb(id varchar(3) , pid varchar(3) , name varchar(10)) insert into tb values('001' , null , '廣東省') insert into tb values('002' , '001' , '廣州市') insert into tb values('003' , '001' , '深圳市') insert into tb values('004' , '002' , '天河區') insert into tb values('005' , '003' , '羅湖區') insert into tb values('006' , '003' , '福田區') insert into tb values('007' , '003' , '寶安區') insert into tb values('008' , '007' , '西鄉鎮') insert into tb values('009' , '007' , '龍華鎮') insert into tb values('010' , '007' , '鬆崗鎮') go --查詢指定節點及其所有子節點的函數 create function f_cid(@ID varchar(3)) returns @t_level table(id varchar(3) , level int) as begin declare @level int set @level = 1 insert into @t_level select @id , @level while @@ROWCOUNT > 0 begin set @level = @level + 1 insert into @t_level select a.id , @level from tb a , @t_Level b where a.pid = b.id and b.level = @level - 1 end return end go --調用函數查詢001(廣東省)及其所有子節點 select a.* from tb a , f_cid('001') b where a.id = b.id order by a.id /* id pid name ---- ---- ---------- 001 NULL 廣東省 002 001 廣州市 003 001 深圳市 004 002 天河區 005 003 羅湖區 006 003 福田區 007 003 寶安區 008 007 西鄉鎮 009 007 龍華鎮 010 007 鬆崗鎮 (所影響的行數爲 10 行) */ --調用函數查詢002(廣州市)及其所有子節點 select a.* from tb a , f_cid('002') b where a.id = b.id order by a.id /* id pid name ---- ---- ---------- 002 001 廣州市 004 002 天河區 (所影響的行數爲 2 行) */ --調用函數查詢003(深圳市)及其所有子節點 select a.* from tb a , f_cid('003') b where a.id = b.id order by a.id /* id pid name ---- ---- ---------- 003 001 深圳市 005 003 羅湖區 006 003 福田區 007 003 寶安區 008 007 西鄉鎮 009 007 龍華鎮 010 007 鬆崗鎮 (所影響的行數爲 7 行) */ drop table tb drop function f_cid
 
-----------------------------------------------------------------------------------------------
 
 
SQL code
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER trigger [tri_updatesalary_Mem_Type] on [dbo].[SalaryIncrease] after insert as declare @i int set @i=@@identity update m set m.Mem_Type=case when s.SMark>500000 then '退休會員'--500000 when s.SMark>400000 then '鑽石五級'--400000 when s.SMark>300000 then '鑽石四級'--300000 when s.SMark>200000 then '鑽石三級'--200000 when s.SMark>100000 then '鑽石二級'--100000 when s.SMark>50000 then '鑽石一級'--50000 when s.SMark>40000 then '五星級'--40000 when s.SMark>30000 then '四星級'--30000 when s.SMark>20000 then '三星級'--20000 when s.SMark>10000 then '二星級'--10000 when s.SMark>5000 then '一星級'--5000 else '一般VIP會員' end from MemberInfo m join (select s.SCardName,sum(s.SMark) as SMark from SalaryIncrease s join inserted i on s.SCardName=i.SCardName group by s.SCardName) s on m.Mem_Num=s.SCardName --if exists(select * from MemberInfo m join inserted i on m.Mem_Num=i.SCardName and m.Mem_Mark>100 ) if exists (select m.SCardName,sum(m.ShopMark)as mark from(select m.SCardName,m.ShopMark from ShoppingMark m join inserted i on m.SCardName=i.SCardName where year(m.SDate)=year(getdate()) and month(m.SDate)=month(getdate())) m group by m.SCardName having sum(m.ShopMark)>100) /**/ /* --最新的(我寫的,上面是整合魅影的)select * from ShoppingMark SM join (select m.SCardName,sum(m.ShopMark) as Mark from ShoppingMark m join inserted i on m.SCardName=i.SCardName group by m.SCardName) s on SM.SCardName=s.ScardName where month(SDate)=month(getdate()) and year(SDate)=year(getdate()) and s.Mark>100*/ begin update s set s.SIncease=case --積分大於1000就是星級.所以不用判斷是否是星級 when m.Mem_Type<>'一般VIP會員' then s.SMark*0.3 else case when s.SMark>4000 then s.SMark*0.3 -- when s.SMark>4000 then -- 200*0.2+200*0.23+200*0.25+200*0.28+(s.SMark-800)*0.3 when s.SMark>3000 then 1000*0.2+1000*0.23+1000*0.25+(s.SMark-600)*0.28 when s.SMark>2000 then 1000*0.2+100*0.23+(s.SMark-400)*0.25 when s.SMark>1000 then (s.SMark-200)*.023+1000*0.2 else s.SMark*0.2 end end from SalaryIncrease as s join inserted i on s.SCardName=i.SCardName join MemberInfo m on (i.SCardName=m.Mem_Num and s.SID=@i) or (i.SCardName=m.Mem_Num and s.SIncease=0) end --go
 
 
-----------------------------------------------------------------------------------------------
 
SQL code
--bom結構,查找節點下所有子節點: create table os(id int,parentid int,desn varchar(10)) insert into os select 1,0,'體育用品' insert into os select 2,0,'戶外運動' insert into os select 3,1,'籃球' insert into os select 4,1,'足球' insert into os select 5,2,'帳篷' insert into os select 6,2,'登山鞋' insert into os select 7,0,'男士用品' insert into os select 8,7,'刮鬍刀' insert into os select 9,3,'大號籃球' --求個節點下所有子節點: create function f_cid(@id int) returns varchar(500) as begin declare @t table(id int,parentid int,desn varchar(10),lev int) declare @lev int set @lev=1 insert into @t select *,@lev from os where id=@id while(@@rowcount>0) begin set @lev=@lev+1 insert into @t select a.*,@lev from os a,@t b where a.parentid=b.id and b.lev=@lev-1 end declare @cids varchar(500) select @cids=isnull(@cids+',','')+ltrim(id) from @t order by lev return @cids end go --調用函數 select *,ids=dbo.f_cid(id) from os --得到每個節點路徑: create proc wsp2 @id int as select *,cast(' ' as varchar(10)) fullpath into #os from os DECLARE @i int,@j int set @i=0 set @j=1 select @i=max(parentid) from #os update #os set fullpath=id while @j<=@i begin update #os set fullpath=a.fullpath+','+ltrim(#os.id) from #os inner join #os a on #os.parentid=a.id where #os.parentid=@j set @j=@j+1 end select * from #os go --調用存儲過程 exec wsp2 1
-----------------------------------------------------------------------------------------------
 
1. 查看數據庫的版本
select @@version

2. 查看數據庫所在機器操作系統參數
exec master..xp_msver

3. 查看數據庫啓動的參數
sp_configure

4. 查看數據庫啓動時間
select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1

查看數據庫服務器名和實例名
print 'Server Name...............: ' + convert(varchar(30),@@SERVERNAME)
print 'Instance..................: ' + convert(varchar(30),@@SERVICENAME)
5. 查看所有數據庫名稱及大小
sp_helpdb

重命名數據庫用的SQL
sp_renamedb 'old_dbname', 'new_dbname'

6. 查看所有數據庫用戶登錄信息
sp_helplogins

查看所有數據庫用戶所屬的角色信息
sp_helpsrvrolemember

修復遷移服務器時孤立用戶時,可以用的fix_orphan_user腳本或者LoneUser過程

更改某個數據對象的用戶屬主
sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'

注意: 更改對象名的任一部分都可能破壞腳本和存儲過程。

把一臺服務器上的數據庫用戶登錄信息備份出來可以用add_login_to_aserver腳本

7. 查看鏈接服務器
sp_helplinkedsrvlogin

查看遠端數據庫用戶登錄信息
sp_helpremotelogin

8.查看某數據庫下某個數據對象的大小
sp_spaceused @objname

還可以用sp_toptables過程看最大的N(默認爲50)個表

查看某數據庫下某個數據對象的索引信息
sp_helpindex @objname

還可以用SP_NChelpindex過程查看更詳細的索引情況
SP_NChelpindex @objname

clustered索引是把記錄按物理順序排列的,索引佔的空間比較少。
對鍵值DML操作十分頻繁的表我建議用非clustered索引和約束,fillfactor參數都用默認值。
查看某數據庫下某個數據對象的的約束信息
sp_helpconstraint @objname

9.查看數據庫裏所有的存儲過程和函數
use @database_name
sp_stored_procedures
查看存儲過程和函數的源代碼
sp_helptext '@procedure_name'

查看包含某個字符串@str的數據對象名稱
select distinct object_name(id) from syscomments where text like '%@str%'

創建加密的存儲過程或函數在AS前面加WITH ENCRYPTION參數

解密加密過的存儲過程和函數可以用sp_decrypt過程

10.查看數據庫裏用戶和進程的信息
sp_who
查看SQL Server數據庫裏的活動用戶和進程的信息
sp_who 'active'
查看SQL Server數據庫裏的鎖的情況
sp_lock

進程號1--50是SQL Server系統內部用的,進程號大於50的纔是用戶的連接進程.
spid是進程編號,dbid是數據庫編號,objid是數據對象編號
查看進程正在執行的SQL語句
dbcc inputbuffer ()

推薦大家用經過改進後的sp_who3過程可以直接看到進程運行的SQL語句
sp_who3

檢查死鎖用sp_who_lock過程
sp_who_lock

11.收縮數據庫日誌文件的方法
收縮簡單恢復模式數據庫日誌,收縮後@database_name_log的大小單位爲M
backup log @database_name with no_log
dbcc shrinkfile (@database_name_log, 5)
12.分析SQL Server SQL 語句的方法:

set statistics time {on | off}
set statistics io {on | off}
圖形方式顯示查詢執行計劃

在查詢分析器->查詢->顯示估計的評估計劃(D)-Ctrl-L 或者點擊工具欄裏的圖形

文本方式顯示查詢執行計劃
set showplan_all {on | off}

set showplan_text { on | off }
set statistics profile { on | off }

13.出現不一致錯誤時,NT事件查看器裏出3624號錯誤,修復數據庫的方法

先註釋掉應用程序裏引用的出現不一致性錯誤的表,然後在備份或其它機器上先恢復然後做修復操作

alter database [@error_database_name] set single_user

修復出現不一致錯誤的表

dbcc checktable('@error_table_name',repair_allow_data_loss)

或者可惜選擇修復出現不一致錯誤的小型數據庫名

dbcc checkdb('@error_database_name',repair_allow_data_loss)
alter database [@error_database_name] set multi_user
CHECKDB 有3個參數:
repair_allow_data_loss 包括對行和頁進行分配和取消分配以改正分配錯誤、結構行或頁的錯誤,
以及刪除已損壞的文本對象,這些修復可能會導致一些數據丟失。
修復操作可以在用戶事務下完成以允許用戶回滾所做的更改。
如果回滾修復,則數據庫仍會含有錯誤,應該從備份進行恢復。
如果由於所提供修復等級的緣故遺漏某個錯誤的修復,則將遺漏任何取決於該修復的修復。
修復完成後,請備份數據庫。
repair_fast 進行小的、不耗時的修復操作,如修復非聚集索引中的附加鍵。
這些修復可以很快完成,並且不會有丟失數據的危險。
repair_rebuild 執行由 repair_fast 完成的所有修復,包括需要較長時間的修復(如重建索引)。
執行這些修復時不會有丟失數據的危險。


以上腳本來源於:  http://www.51windows.net/data/files/file_797.asp 
 
-----------------------------------------------------------------------------------------------
 
SQL code
--庫存先進先出簡單例子: create table t( id int identity(1,1), name varchar(50),--商品名稱 j int, --入庫數量 c int, --出庫數量 jdate datetime --入庫時間 ) insert into t(name,j,c,jdate) select 'A',100,0,'2007-12-01' insert into t(name,j,c,jdate) select 'A',200,0,'2008-01-07' insert into t(name,j,c,jdate) select 'B',320,0,'2007-12-21' insert into t(name,j,c,jdate) select 'A',100,0,'2008-01-15' insert into t(name,j,c,jdate) select 'B',90,0,'2008-02-03' insert into t(name,j,c,jdate) select 'A',460,0,'2008-02-01' insert into t(name,j,c,jdate) select 'A',510,0,'2008-03-01' go create proc wsp @name varchar(50),--商品名稱 @cost int --銷售量 as --先得出該貨物的庫存是否夠 declare @spare float --剩餘庫存 select @spare=sum(j)-sum(c) from t where name=@name if(@spare>=@cost) begin --根據入庫日期採用先進先出原則對貨物的庫存進行處理 update t set c= case when (select @cost-isnull(sum(j),0)+isnull(sum(c),0) from t where name=@name and jdate<=a.jdate and j!=c)>=0 then a.j else case when (select @cost-isnull(sum(j),0)+isnull(sum(c),0) from t where name=@name and jdate<a.jdate and j!=c)<0 then 0 else (select @cost-isnull(sum(j),0)+isnull(sum(c),0)+a.c from t where name=@name and jdate<a.jdate and j!=c) end end from t a where name=@name and j!=c end else raiserror('庫存不足',16,1) return go --測試: exec wsp @name='A',@cost=180 select * from t --drop table t --drop proc wsp
 
-----------------------------------------------------------------------------------------------
 
SQL code
--返程問題,找出僱員從本地出發後直接返回的情況 create table trav(name nvarchar(10),date datetime,comefrom nvarchar(10),destin nvarchar(10),id int) insert into trav select '張三','2007-01-01','上海','廣州',1 insert into trav select '李四','2007-01-01','上海','廣州',2 insert into trav select '李四','2007-02-01','上海','成都',3 insert into trav select '張三','2007-01-15','廣州','上海',4 insert into trav select '張三','2007-02-06','上海','廣州',5 insert into trav select '張三','2007-02-18','廣州','上海',6 go select a.name,a.date,a.comefrom,a.destin,b.date,b.comefrom,b.destin from trav a inner join trav b on a.name=b.name and a.comefrom=b.destin and a.destin=b.comefrom where a.id<b.id and not exists(select 1 from trav where comefrom=b.comefrom and date<b.date and date>a.date) go drop table trav /* name date comefrom destin date comefrom destin ---------- ----------------------- ---------- ---------- ----------------------- ---------- ---------- 張三 2007-01-01 00:00:00.000 上海 廣州 2007-01-15 00:00:00.000 廣州 上海 張三 2007-02-06 00:00:00.000 上海 廣州 2007-02-18 00:00:00.000 廣州 上海 (2 行受影響) */
-----------------------------------------------------------------------------------------------
 
SQL code
--日期轉換參數,值得收藏 select CONVERT(varchar, getdate(), 120 ) 2004-09-12 11:06:08 select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','') 20040912110608 select CONVERT(varchar(12) , getdate(), 111 ) 2004/09/12 select CONVERT(varchar(12) , getdate(), 112 ) 20040912 select CONVERT(varchar(12) , getdate(), 102 ) 2004.09.12 其它我不常用的日期格式轉換方法: select CONVERT(varchar(12) , getdate(), 101 ) 09/12/2004 select CONVERT(varchar(12) , getdate(), 103 ) 12/09/2004 select CONVERT(varchar(12) , getdate(), 104 ) 12.09.2004 select CONVERT(varchar(12) , getdate(), 105 ) 12-09-2004 select CONVERT(varchar(12) , getdate(), 106 ) 12 09 2004 select CONVERT(varchar(12) , getdate(), 107 ) 09 12, 2004 select CONVERT(varchar(12) , getdate(), 108 ) 11:06:08 select CONVERT(varchar(12) , getdate(), 109 ) 09 12 2004 1 select CONVERT(varchar(12) , getdate(), 110 ) 09-12-2004 select CONVERT(varchar(12) , getdate(), 113 ) 12 09 2004 1 select CONVERT(varchar(12) , getdate(), 114 ) 11:06:08.177
-----------------------------------------------------------------------------------------------
 
SQL code
--我來一段 --SQL2005 CREATE TABLE #t (id int IDENTITY(1,1) PRIMARY KEY,nums int) GO INSERT INTO #t SELECT abs(CHECKSUM(NEWID())%100000) GO 10000 ----生成10000筆資料,可以是任意一數字 SELECT * FROM #t GO DROP TABLE #t GO
---------------------------------------------------------------------------------------------
 
 
固定列數的行列轉換

student subject grade
--------- ---------- --------
student1 語文 80
student1 數學 70
student1 英語 60
student2 語文 90
student2 數學 80
student2 英語 100
……
轉換爲
語文 數學 英語
student1 80 70 60
student2 90 80 100
……
語句如下:select student,
sum(decode(subject,'語文', grade,null)) "語文",
sum(decode(subject,'數學', grade,null)) "數學",
sum(decode(subject,'英語', grade,null)) "英語"
from table
group by student;
--------------------------------------------------------------------------------------------
 
SELECT * FROM TABLENAME
絕對經典,最常用的查詢
 
 
 

 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章