Sqlserver useful information

  1. DECLARE @dt datetime  
  2. SET @dt=GETDATE()  
  3.   
  4. DECLARE @number int  
  5. SET @number=3  
  6.   
  7. --1.指定日期该年的第一天或最后一天  
  8. --A. 年的第一天  
  9. SELECT CONVERT(char(5),@dt,120)+'1-1'  
  10.   
  11. --B. 年的最后一天  
  12. SELECT CONVERT(char(5),@dt,120)+'12-31'  
  13.   
  14.   
  15. --2.指定日期所在季度的第一天或最后一天  
  16. --A. 季度的第一天  
  17. SELECT CONVERT(datetime,  
  18.     CONVERT(char(8),  
  19.         DATEADD(Month,  
  20.             DATEPART(Quarter,@dt)*3-Month(@dt)-2,  
  21.             @dt),  
  22.         120)+'1')  
  23.   
  24. --B. 季度的最后一天(CASE判断法)  
  25. SELECT CONVERT(datetime,  
  26.     CONVERT(char(8),  
  27.         DATEADD(Month,  
  28.             DATEPART(Quarter,@dt)*3-Month(@dt),  
  29.             @dt),  
  30.         120)  
  31.     +CASE WHEN DATEPART(Quarter,@dt) in(1,4)  
  32.         THEN '31'ELSE '30' END)  
  33.   
  34. --C. 季度的最后一天(直接推算法)  
  35. SELECT DATEADD(Day,-1,  
  36.     CONVERT(char(8),  
  37.         DATEADD(Month,  
  38.             1+DATEPART(Quarter,@dt)*3-Month(@dt),  
  39.             @dt),  
  40.         120)+'1')  
  41.   
  42.   
  43. --3.指定日期所在月份的第一天或最后一天  
  44. --A. 月的第一天  
  45. SELECT CONVERT(datetime,CONVERT(char(8),@dt,120)+'1')  
  46.   
  47. --B. 月的最后一天  
  48. SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+'1')  
  49.   
  50. --C. 月的最后一天(容易使用的错误方法)  
  51. SELECT DATEADD(Month,1,DATEADD(Day,-DAY(@dt),@dt))  
  52.   
  53.   
  54. --4.指定日期所在周的任意一天  
  55. SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)  
  56.   
  57.   
  58. --5.指定日期所在周的任意星期几  
  59. --A.  星期天做为一周的第1天  
  60. SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt)  
  61.   
  62. --B.  星期一做为一周的第1天  
  63. SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)  
  64.   
  65.   
  66. ---系统表说明  
  67. syscolumns  
  68. 每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行。该表位于每个数据库中。  
  69.   
  70. 列名 数据类型 描述   
  71. name sysname 列名或过程参数的名称。   
  72. id int 该列所属的表对象 ID,或与该参数关联的存储过程 ID。   
  73. xtype tinyint systypes 中的物理存储类型。   
  74. typestat tinyint 仅限内部使用。   
  75. xusertype smallint 扩展的用户定义数据类型 ID。   
  76. length smallint systypes 中的最大物理存储长度。   
  77. xprec tinyint 仅限内部使用。   
  78. xscale tinyint 仅限内部使用。   
  79. colid smallint 列或参数 ID。   
  80. xoffset smallint 仅限内部使用。   
  81. bitpos tinyint 仅限内部使用。   
  82. reserved tinyint 仅限内部使用。   
  83. colstat smallint 仅限内部使用。   
  84. cdefault int 该列的默认值 ID。   
  85. domain int 该列的规则或 CHECK 约束 ID。   
  86. number smallint 过程分组时(0 表示非过程项)的子过程号。   
  87. colorder smallint 仅限内部使用。   
  88. autoval varbinary(255) 仅限内部使用。   
  89. offset smallint 该列所在行的偏移量;如果为负,表示可变长度行。   
  90. status tinyint 用于描述列或参数属性的位图:   
  91. 0x08 = 列允许空值。  
  92. 0x10 = 当添加 varchar 或 varbinary 列时,ANSI 填充生效。保留 varchar 列的尾随空格,保留 varbinary 列的尾随零。  
  93. 0x40 = 参数为 OUTPUT 参数。  
  94. 0x80 = 列为标识列。  
  95.    
  96. type tinyint systypes 中的物理存储类型。   
  97. usertype smallint systypes 中的用户定义数据类型 ID。   
  98. printfmt varchar(255) 仅限内部使用。   
  99. prec smallint 该列的精度级别。   
  100. scale int 该列的小数位数。   
  101. iscomputed int 表示是否已计算该列的标志:   
  102. 0 = 未计算。  
  103. 1 = 已计算。  
  104.    
  105. isoutparam int 表示该过程参数是否是输出参数:   
  106. 1 = 真。  
  107. 0 = 假。  
  108.    
  109. isnullable int 表示该列是否允许空值:   
  110. 1 = 真。  
  111. 0 = 假。  
  112.   
  113.   
  114.   
  115. 排序问题   
  116.   
  117. CREATE TABLE [t] (   
  118. [id] [int] IDENTITY (1, 1) NOT NULL ,   
  119. [GUID] [uniqueidentifier] NULL   
  120. ) ON [PRIMARY]   
  121. GO   
  122.   
  123. 下面这句执行5次   
  124. insert t values (newid())   
  125. 查看执行结果   
  126. select * from t   
  127.   
  128. 1、 第一种   
  129. select * from t   
  130. order by case id when 4 then 1   
  131.                   when 5 then 2   
  132.                   when 1 then 3   
  133.                   when 2 then 4   
  134.                   when 3 then 5 end   
  135. 2、 第二种   
  136. select * from t order by (id+2)%6   
  137. 3、 第三种   
  138. select * from t order by charindex(cast(id as varchar),'45123')   
  139. 4、 第四种   
  140. select * from t   
  141. WHERE id between 0 and 5   
  142. order by charindex(cast(id as varchar),'45123')   
  143. 5、 第五种   
  144. select * from t order by case when id >3 then id-5 else id end   
  145. 6、 第六种   
  146. select * from t order by id / 4 desc,id asc   
  147.   
  148.  一条语句删除一批记录   
  149. 首先id列是int标识类类型,然后删除ID值为5,6,8,9,10,11的列,这里的cast函数不能用convert函数代替,而且转换的类型必须是varchar,而不能是char,否则就会执行出你不希望的结果,这里的"5,6,8,9,10,11"可以是你在页面上获取的一个chkboxlist构建成的值,然后用下面的一句就全部删   
  150. 除了,比循环用多条语句高效吧应该。   
  151.   
  152. delete from [fujian] where charindex(','+cast([id] as varchar)+',',','+'5,6,8,9,10,11,'+',')>0   
  153.   
  154. 还有一种就是  
  155. delete from table1 where id in(1,2,3,4 )   

    1. --动态SQL基本语法:  
    2. 1 :普通SQL语句可以用exec执行   
    3.   
    4. Select * from tableName   
    5. exec('select * from tableName')   
    6. exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N   
    7.   
    8. 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL   
    9.   
    10. declare @fname varchar(20)   
    11. set @fname = 'FiledName'   
    12. Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。   
    13. exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格   
    14.   
    15. 当然将字符串改成变量的形式也可   
    16. declare @fname varchar(20)   
    17. set @fname = 'FiledName' --设置字段名   
    18.   
    19. declare @s varchar(1000)   
    20. set @s = 'select ' + @fname + ' from tableName'   
    21. exec(@s) -- 成功   
    22. exec sp_executesql @s -- 此句会报错   
    23.   
    24. declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)   
    25. set @s = 'select ' + @fname + ' from tableName'   
    26. exec(@s) -- 成功   
    27. exec sp_executesql @s -- 此句正确   
    28.   
    29. 3. 输出参数   
    30. declare @num int, @sqls nvarchar(4000)   
    31. set @sqls='select count(*) from tableName'   
    32. exec(@sqls)   
    33.   
    34. --如何将exec执行结果放入变量中?   
    35.   
    36. declare @num int, @sqls nvarchar(4000)   
    37. set @sqls='select @a=count(*) from tableName '   
    38. exec sp_executesql @sqls,N'@a int output',@num output   
    39. select @num   
    40.   
    41.   
    42. 1 :普通SQL语句可以用Exec执行      例: Select * from tableName   
    43.     Exec('select * from tableName')   
    44.     Exec sp_executesql N'select * from tableName'    -- 请注意字符串前一定要加N   
    45.   
    46. 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL   
    47.   
    48.   错误:declare @fname varchar(20)   
    49.     set @fname = 'FiledName'   
    50.     Select @fname from tableName   -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。  
    51.     正确:      Exec('select ' + @fname + ' from tableName')     -- 请注意加号前后的单引号的边上加空格  
    52.   
    53.     当然将字符串改成变量的形式也可  
    54.      declare @fname varchar(20)   
    55.     set @fname = 'FiledName' --设置字段名  
    56.   
    57.      declare @s varchar(1000)   
    58.      set @s = 'select ' + @fname + ' from tableName'   
    59.      Exec(@s)                -- 成功  
    60.       exec sp_executesql @s   -- 此句会报错  
    61.   
    62.       --注:@s参数必须为ntext或nchar或nvarchar类型,必须将declare @s varchar(1000) 改为declare @s Nvarchar(1000)   
    63.        如下:  
    64.     declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)   
    65.   
    66.       set @fname = 'FiledName' --设置字段名  
    67.        set @s = 'select ' + @fname + ' from tableName'   
    68.       Exec(@s)                -- 成功      
    69.        exec sp_executesql @s   -- 此句正确  
    70.   
    71. 3. 输入或输出参数  
    72.   
    73.    (1)输入参数:  
    74.       declare @QueryString nvarchar(1000) --动态查询语句变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)  
    75.       declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)  
    76.       declare @input_id int--定义需传入动态语句的参数的值  
    77.   
    78.        set @QueryString='select * from tablename  where id=@id'  --id为字段名,@id为要传入的参数  
    79.        set @paramstring='@id int' --设置动态语句中参数的定义的字符串  
    80.        set @input_id =1  --设置需传入动态语句的参数的值为1  
    81.       exec sp_executesql @querystring,@paramstring,@id=@input_id    
    82.        若有多个参数:  
    83.       declare @QueryString nvarchar(1000) --动态查询语句变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)  
    84.       declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)  
    85.       declare @input_id int--定义需传入动态语句的参数的值,参数1  
    86.       declare @input_name varchar(20)--定义需传入动态语句的参数的值,参数2  
    87.   
    88.       set @QueryString='select * from tablename  where id=@id and name=@name'   --id与name为字段名,@id与@name为要传入的参数  
    89.        set @paramstring='@id int,@name varchar(20)' --设置动态语句中参数的定义的字符串,多个参数用","隔开  
    90.        set @input_id =1  --设置需传入动态语句的参数的值为1  
    91.       set @input_name='张三'   --设置需传入动态语句的参数的值为"张三"  
    92.       exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name --请注意参数的顺序  
    93.    (2)输出参数  
    94.        declare @num int, @sqls nvarchar(4000)   
    95.       set @sqls='select count(*) from tableName'   
    96.       exec(@sqls)   
    97.      --如何将exec执行结果放入变量中?            
    98.       declare @QueryString nvarchar(1000) --动态查询语名变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)  
    99.      declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)  
    100.      declare @output_result int--查询结果赋给@output_result   
    101.   
    102.      set @QueryString='select @totalcount=count(*) from tablename' --@totalcount 为输出结果参数  
    103.       set @paramstring='@totalcount int output' --设置动态语句中参数的定义的字符串,多个参数用","隔开  
    104.       exec sp_executesql @querystring,@paramstring,@totalcount=@output_result output  
    105.      select @output_result  
    106.      当然,输入与输出参数可以一起使用,大家可以自己去试一试。  
    107.       另外,动态语句查询的结果集要输出的话,我只想到以下用临时表的方法,不知各位有没有更好的方法.  
    108.      IF object_id('[tempdb].[dbo].#tmp') IS NOT NULL --判断临时表#tmp是否存在,存在则删除  
    109.       drop table #tmp  
    110.      select * into #tmp from tablename where 1=2 --创建临时表#tmp,其结构与tablename相同  
    111.   
    112.      declare @QueryString nvarchar(1000) --动态查询语名变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)  
    113.     set @QueryString='select * from tablename '  
    114.     insert into #tmp(field1,field2,...) exec(@querystirng)   
    115.   
    116.   
    117.   
    118. 1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)   
    119. 法一:select * into b from a where 1 <>1   
    120. 法二:select top 0 * into b from a   
    121.   
    122. 2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)   
    123. insert into b(a, b, c) select d,e,f from a;   
    124.   
    125. 3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)   
    126. insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件   
    127. 例子:..from b in '"&Server.MapPath(".")&"/data.mdb" &"' where..   
    128.   
    129. 4、说明:子查询(表名1:a 表名2:b)   
    130. 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)   
    131.   
    132. 5、说明:显示文章、提交人和最后回复时间   
    133. select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b   
    134.   
    135. 6、说明:外连接查询(表名1:a 表名2:b)   
    136. select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c   
    137.   
    138. 7、说明:在线视图查询(表名1:a )   
    139. select * from (SELECT a,b,c FROM a) T where t.a > 1;   
    140.   
    141. 8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括   
    142. select * from table1 where time between time1   
    143.   
    144. 9、说明:in 的使用方法   
    145. select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)   
    146.   
    147. 10、说明:两张关联表,删除主表中已经在副表中没有的信息   
    148. delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )   
    149.   
    150. 11、说明:四表联查问题:   
    151. 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 .....   
    152.   
    153. 12、说明:日程安排提前五分钟提醒   
    154. SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5   
    155.   
    156. 13、说明:一条sql 语句搞定数据库分页   
    157. select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段   
    158.   
    159. 14、说明:前10条记录   
    160. select top 10 * form table1 where 范围   
    161.   
    162. 15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)   
    163. select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)   
    164.   
    165. 16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表   
    166. (select a from tableA ) except (select a from tableB) except (select a from tableC)   
    167.   
    168. 17、说明:随机取出10条数据   
    169. select top 10 * from tablename order by newid()   
    170.   
    171. 18、说明:随机选择记录   
    172. select newid()   
    173.   
    174. 19、说明:删除重复记录   
    175. Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)   
    176.   
    177. 20、说明:列出数据库里所有的表名   
    178. select name from sysobjects where type='U'   
    179.   
    180. 21、说明:列出表里的所有的列   
    181. select name from syscolumns where id=object_id('TableName')   
    182.   
    183. 22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。   
    184. 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   
    185. 显示结果:   
    186. type vender pcs   
    187. 电脑 A 1   
    188. 电脑 A 1   
    189. 光盘 B 2   
    190. 光盘 A 2   
    191. 手机 B 3   
    192. 手机 C 3   
    193.   
    194. 23、说明:初始化表table1   
    195. TRUNCATE TABLE table1   
    196.   
    197. 24、说明:选择从10到15的记录   
    198. select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc   
    199.   
    200. declare @a varchar(100),@b varchar(20)   
    201. select @a='abcdefbcmnbcde',@b='bc'   
    202. select (len(@a)-len(replace(@a,@b,'')))/len(@b)  
    203.   
    204. 说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)   
    205. select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)  
    206.   
    207.   
    208.   
    209.   
    210. 一年中所有为星期二的日期   
    211.   
    212. select dateadd(day,x,col),'星期二' from   
    213. (   
    214. select cast('2006-1-1' as datetime) as col   
    215. )a cross join   
    216. (   
    217. SELECT  top 365 b8.i+b7.i + b6.i + b5.i + b4.i +b3.i +b2.i + b1.i + b0.i x   
    218. FROM(SELECT 0 i UNION ALL SELECT 1) b0   
    219. CROSS JOIN(SELECT 0 i UNION ALL SELECT 2) b1   
    220. CROSS JOIN(SELECT 0 i UNION ALL SELECT 4) b2   
    221. CROSS JOIN(SELECT 0 i UNION ALL SELECT 8) b3   
    222. CROSS JOIN(SELECT 0 i UNION ALL SELECT 16) b4   
    223. CROSS JOIN(SELECT 0 i UNION ALL SELECT 32) b5   
    224. CROSS JOIN(SELECT 0 i UNION ALL SELECT 64) b6   
    225. CROSS JOIN(SELECT 0 i UNION ALL SELECT 128) b7   
    226. CROSS JOIN(SELECT 0 i UNION ALL SELECT 256) b8   
    227. order by 1   
    228. )b   
    229. where datepart(dw,dateadd(day,x,col))=3  
    230.   
    231.   
    232.   
    233.   
    234. /*功能:2000当中绘画日历 */  
    235. DECLARE @Year nvarchar(4)  
    236. DECLARE @YearMonth nvarchar(7)    --月份  
    237. DECLARE @strTop nvarchar(200)  
    238. DECLARE @ForI INT,@ForYear INT ,@MaxDay INT  
    239. DECLARE @RowX INT --行位置   
    240. DECLARE @strWeekDayList nvarchar(20)  
    241. DECLARE @strPrint nvarchar(300)  
    242.   
    243. -- ======================================  
    244. SET @Year='2008'    --请在这里输入年份  
    245. -- ======================================  
    246. SET @strTop= '日'+char(9)+'一'+char(9)+'二' +char(9)+'三'++char(9)+'四'++char(9)+'五'++char(9)+'六' +char(13)+  
    247.          '───────────────────────────'  
    248. SET @strWeekDayList='日一二三四五六'  
    249. SET @ForYear=1  
    250. WHILE @ForYear<=12  --1月份至12月份  
    251.  BEGIN  
    252.     SET @YearMonth=@Year + '-' +CAST( @ForYear AS nvarchar(2))  
    253.     SET @MaxDay=DAY(DATEADD(Day,-1,DATEADD(Month,1,@YearMonth+'-01')))  
    254.     SET @RowX=CHARINDEX(RIGHT(DATENAME(WeekDay,@YearMonth+'-01'),1),@strWeekDayList)-1  
    255.     SET @strPrint=''  
    256.     SET @ForI=1  
    257.     WHILE @ForI<=@RowX    --构造1号的位置  
    258.          BEGIN  
    259.         SET @strPrint=@strPrint+CHAR(9)  
    260.         SET @ForI=@ForI+1  
    261.          END  
    262.         SET @ForI=1  
    263.     WHILE @ForI<=@MaxDay    --构造2号到月底的位置  
    264.          BEGIN  
    265.         SET @strPrint=@strPrint+CAST(@ForI AS nvarchar(2)) +Char(9)      
    266.         SET @RowX=@RowX+1  
    267.         SET @ForI=@ForI+1  
    268.       IF (@RowX%7=0)  
    269.            BEGIN  
    270.             SET @RowX=0   
    271.             SET @strPrint=@strPrint+CHAR(13)  
    272.              END  
    273.        END  
    274.     SET @ForYear=@ForYear+1  
    275.     -- 打印输出一个月的结果  
    276.     PRINT '━━━━━━━━━━━━━━━━━━━━━━━━━━━'  
    277.     PRINT +Char(9)++Char(9)+'    '+@YearMonth+CHAR(10)  
    278.     PRINT @strTop  
    279.     PRINT @strPrint+CHAR(10)  
    280.   END  
    281.   
    282.   
    283.   
    284.   
    285. 1. 查看数据库的版本   
    286. select @@version   
    287.   
    288. 2. 查看数据库所在机器操作系统参数   
    289. exec master..xp_msver   
    290.   
    291. 3. 查看数据库启动的参数   
    292. sp_configure   
    293.   
    294. 4. 查看数据库启动时间   
    295. select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1   
    296.   
    297. 查看数据库服务器名和实例名   
    298. print 'Server Name...............: ' + convert(varchar(30),@@SERVERNAME)   
    299. print 'Instance..................: ' + convert(varchar(30),@@SERVICENAME)   
    300. 5. 查看所有数据库名称及大小   
    301. sp_helpdb   
    302.   
    303. 重命名数据库用的SQL   
    304. sp_renamedb 'old_dbname''new_dbname'   
    305.   
    306. 6. 查看所有数据库用户登录信息   
    307. sp_helplogins   
    308.   
    309. 查看所有数据库用户所属的角色信息   
    310. sp_helpsrvrolemember   
    311.   
    312. 修复迁移服务器时孤立用户时,可以用的fix_orphan_user脚本或者LoneUser过程   
    313.   
    314. 更改某个数据对象的用户属主   
    315. sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'   
    316.   
    317. 注意: 更改对象名的任一部分都可能破坏脚本和存储过程。   
    318.   
    319. 把一台服务器上的数据库用户登录信息备份出来可以用add_login_to_aserver脚本   
    320.   
    321. 7. 查看链接服务器   
    322. sp_helplinkedsrvlogin   
    323.   
    324. 查看远端数据库用户登录信息   
    325. sp_helpremotelogin  
    326.   
    327. 8.查看某数据库下某个数据对象的大小   
    328. sp_spaceused @objname   
    329.   
    330. 还可以用sp_toptables过程看最大的N(默认为50)个表   
    331.   
    332. 查看某数据库下某个数据对象的索引信息   
    333. sp_helpindex @objname   
    334.   
    335. 还可以用SP_NChelpindex过程查看更详细的索引情况   
    336. SP_NChelpindex @objname   
    337.   
    338. clustered索引是把记录按物理顺序排列的,索引占的空间比较少。   
    339. 对键值DML操作十分频繁的表我建议用非clustered索引和约束,fillfactor参数都用默认值。   
    340. 查看某数据库下某个数据对象的的约束信息   
    341. sp_helpconstraint @objname   
    342.   
    343. 9.查看数据库里所有的存储过程和函数   
    344. use @database_name   
    345. sp_stored_procedures   
    346. 查看存储过程和函数的源代码   
    347. sp_helptext '@procedure_name'   
    348.   
    349. 查看包含某个字符串@str的数据对象名称   
    350. select distinct object_name(id) from syscomments where text like '%@str%'   
    351.   
    352. 创建加密的存储过程或函数在AS前面加WITH ENCRYPTION参数   
    353.   
    354. 解密加密过的存储过程和函数可以用sp_decrypt过程  
    355.   
    356. 10.查看数据库里用户和进程的信息   
    357. sp_who   
    358. 查看SQL Server数据库里的活动用户和进程的信息   
    359. sp_who 'active'   
    360. 查看SQL Server数据库里的锁的情况   
    361. sp_lock   
    362.   
    363. 进程号1--50是SQL Server系统内部用的,进程号大于50的才是用户的连接进程.   
    364. spid是进程编号,dbid是数据库编号,objid是数据对象编号   
    365. 查看进程正在执行的SQL语句   
    366. dbcc inputbuffer ()   
    367.   
    368. 推荐大家用经过改进后的sp_who3过程可以直接看到进程运行的SQL语句   
    369. sp_who3   
    370.   
    371. 检查死锁用sp_who_lock过程   
    372. sp_who_lock   
    373.   
    374. 11.收缩数据库日志文件的方法   
    375. 收缩简单恢复模式数据库日志,收缩后@database_name_log的大小单位为M   
    376. backup log @database_name with no_log   
    377. dbcc shrinkfile (@database_name_log, 5)   
    378.   
    379. 12.分析SQL Server SQL 语句的方法:   
    380.   
    381. set statistics time {on | off}   
    382. set statistics io {on | off}   
    383. 图形方式显示查询执行计划   
    384.   
    385. 在查询分析器->查询->显示估计的评估计划(D)-Ctrl-L 或者点击工具栏里的图形   
    386.   
    387. 文本方式显示查询执行计划   
    388. set showplan_all {on | off}   
    389.   
    390. set showplan_text { on | off }   
    391. set statistics profile { on | off }   
    392.   
    393. 13.出现不一致错误时,NT事件查看器里出3624号错误,修复数据库的方法   
    394.   
    395. 先注释掉应用程序里引用的出现不一致性错误的表,然后在备份或其它机器上先恢复然后做修复操作   
    396.   
    397. alter database [@error_database_name] set single_user   
    398.   
    399. 修复出现不一致错误的表   
    400.   
    401. dbcc checktable('@error_table_name',repair_allow_data_loss)   
    402.   
    403. 或者可惜选择修复出现不一致错误的小型数据库名   
    404.   
    405. dbcc checkdb('@error_database_name',repair_allow_data_loss)   
    406. alter database [@error_database_name] set multi_user   
    407. CHECKDB 有3个参数:   
    408. repair_allow_data_loss 包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,   
    409. 以及删除已损坏的文本对象,这些修复可能会导致一些数据丢失。   
    410. 修复操作可以在用户事务下完成以允许用户回滚所做的更改。   
    411. 如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。   
    412. 如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。   
    413. 修复完成后,请备份数据库。   
    414. repair_fast 进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。   
    415. 这些修复可以很快完成,并且不会有丢失数据的危险。   
    416. repair_rebuild 执行由 repair_fast 完成的所有修复,包括需要较长时间的修复(如重建索引)。   
    417. 执行这些修复时不会有丢失数据的危险。   
    1. ---join的用法  
    2. DECLARE   
    3. @TA TABLE (IDA INT,VA VARCHAR(10))  
    4. DECLARE  
    5. @TB TABLE (IDB INT,VB VARCHAR(10))  
    6.   
    7. INSERT INTO @TA   
    8. SELECT  
    9. 1,'AA' UNION SELECT  
    10. 2,'BC' UNION SELECT  
    11. 3,'CCC'  
    12.   
    13. INSERT INTO @TB  
    14. SELECT   
    15. 1,'2'  UNION SELECT  
    16. 3,'58' UNION SELECT  
    17. 4,'67'   
    18.   
    19. --内联接简单写法  
    20. SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A,@TB B  
    21. WHERE A.IDA=B.IDB  
    22.   
    23. --内联接  
    24. SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A INNER JOIN @TB B  
    25. ON A.IDA=B.IDB  
    26.   
    27. SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A JOIN @TB B  
    28. ON A.IDA=B.IDB  
    29.   
    30. --左外联接  
    31. SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A LEFT JOIN @TB B  
    32. ON A.IDA=B.IDB  
    33.   
    34. SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A LEFT OUTER JOIN @TB B  
    35. ON A.IDA=B.IDB  
    36.   
    37. --右外联接  
    38. SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A RIGHT JOIN @TB B  
    39. ON A.IDA=B.IDB  
    40.   
    41. SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A RIGHT OUTER JOIN @TB B  
    42. ON A.IDA=B.IDB  
    43.   
    44. --完整外联接  
    45. SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A FULL JOIN @TB B  
    46. ON A.IDA=B.IDB  
    47.   
    48. SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A FULL OUTER JOIN @TB B  
    49. ON A.IDA=B.IDB  
    50.   
    51.   
    52. --交叉联接  
    53. SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A CROSS JOIN @TB B  
    54.   
    55. --自联接  
    56. SELECT A.IDA,A.VA,B.IDA,B.VA FROM @TA A,@TA B WHERE A.IDA=B.IDA+1  
    57.   
    58.   
    59.   
    60. 查询分析器中执行:  
    61. --建表table1,table2:  
    62. create table table1(id int,name varchar(10))  
    63. create table table2(id int,score int)  
    64. insert into table1 select 1,'lee'  
    65. insert into table1 select 2,'zhang'  
    66. insert into table1 select 4,'wang'  
    67. insert into table2 select 1,90  
    68. insert into table2 select 2,100  
    69. insert into table2 select 3,70  
    70. 如表  
    71. -------------------------------------------------  
    72. table1|table2|  
    73. -------------------------------------------------  
    74. idname|idscore|  
    75. 1lee|190|  
    76. 2zhang|2100|  
    77. 4wang|370|  
    78. -------------------------------------------------  
    79.   
    80. 以下均在查询分析器中执行  
    81.   
    82. 一、外连接  
    83. 1.概念:包括左向外联接、右向外联接或完整外部联接  
    84.   
    85. 2.左连接:left join 或 left outer join  
    86. (1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。  
    87. (2)sql语句  
    88. select * from table1 left join table2 on table1.id=table2.id  
    89. -------------结果-------------  
    90. idnameidscore  
    91. ------------------------------  
    92. 1lee190  
    93. 2zhang2100  
    94. 4wangNULLNULL  
    95. ------------------------------  
    96. 注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示  
    97.   
    98. 3.右连接:right join 或 right outer join  
    99. (1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。  
    100. (2)sql语句  
    101. select * from table1 right join table2 on table1.id=table2.id  
    102. -------------结果-------------  
    103. id  name   id   score  
    104. ------------------------------  
    105. 1   lee    19    0  
    106. 2    z     hang  2100  
    107. 4    NULL NULL  370  
    108. ------------------------------  
    109. 注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示  
    110.   
    111. 4.完整外部联接:full join 或 full outer join   
    112. (1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。  
    113. (2)sql语句  
    114. select * from table1 full join table2 on table1.id=table2.id  
    115. -------------结果-------------  
    116. idnameidscore  
    117. ------------------------------  
    118. 1lee190  
    119. 2zhang2100  
    120. 4wangNULLNULL  
    121. NULLNULL370  
    122. ------------------------------  
    123. 注释:返回左右连接的和(见上左、右连接)  
    124.   
    125. 二、内连接  
    126. 1.概念:内联接是用比较运算符比较要联接列的值的联接  
    127.   
    128. 2.内连接:join 或 inner join   
    129.   
    130. 3.sql语句  
    131. select * from table1 join table2 on table1.id=table2.id  
    132. -------------结果-------------  
    133. idnameidscore  
    134. ------------------------------  
    135. 1lee190  
    136. 2zhang2100  
    137. ------------------------------  
    138. 注释:只返回符合条件的table1和table2的列  
    139.   
    140. 4.等价(与下列执行效果相同)  
    141. A:select a.*,b.* from table1 a,table2 b where a.id=b.id  
    142. B:select * from table1 cross join table2 where table1.id=table2.id  (注:cross join后加条件只能用where,不能用on)  
    143.   
    144. 三、交叉连接(完全)  
    145.   
    146. 1.概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生3*3=9条记录)  
    147.   
    148. 2.交叉连接:cross join (不带条件where...)  
    149.   
    150. 3.sql语句  
    151. select * from table1 cross join table2  
    152. -------------结果-------------  
    153. idnameidscore  
    154. ------------------------------  
    155. 1lee190  
    156. 2zhang190  
    157. 4wang190  
    158. 1lee2100  
    159. 2zhang2100  
    160. 4wang2100  
    161. 1lee370  
    162. 2zhang370  
    163. 4wang370  
    164. ------------------------------  
    165. 注释:返回3*3=9条记录,即笛卡尔积  
    166.   
    167. 4.等价(与下列执行效果相同)  
    168. A:select * from table1,table2
        
    Original address:http://topic.csdn.net/u/20091009/11/5F3EBD1A-DE5F-4D92-BC76-0F2103A34B5A.html#top
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值