bingtuag 发表于 2016-11-2 04:16:39

SQL Server 2005基础知识整理

  
SQL Server 2005基础知识整理
  
  1.ACID:指数据库事务正确执行的四个基本要素缩写:1.原子性2.一致性3.隔离性4.持久性
  2.数据库对象:表(table)视图(view)存储过程(storedprocedure)函数(function)索引(index)
  3.SQLServer2005中包含master、model、msdb、tempdb四个系统数据库。
  4.使用T-SQL语句创建数据库:
  CREATEDATABASEONPRIMARY
  (NAME=N'ApressFinacial',FILENAME=N'I:\ProgramFiles\MicrosoftSQLServer\MSSQL.1\MSSQL\DATA\ApressFinacial.mdf',SIZE=3072KB,FILEGROWTH=1024KB)
  LOGON
  (NAME=N'ApressFinacial_log',FILENAME=N'I:\ProgramFiles\MicrosoftSQLServer\MSSQL.1\MSSQL\DATA\ApressFinacial_log.ldf',SIZE=1024KB,FILEGROWTH=10%)
  5.T-SQL语句删除数据库:dropdatabase[数据库名]
  6.常见的约束类型:主键约束、唯一约束、检查约束、默认约束、外键约束。
  7.添加约束的语法:
  Altertable表名
  Addconstraint约束名约束类型具体的约束说明
  8.删除约束:altertable表名
  Dropconstraint约束名
  9.授权语法:grant权限to数据库用户
  例:grantselectinsertupdate
  Onstudentstozhangsan
  10.T-SQL语句创建登录名:
  Createlogin
  Withpassword='130125'
  Go
  11.数据库完整性分为:实体完整性、域完整性、参照完整性、用户自定义完整性。
  12.T-SQL中的运算符:
  运算符
  含义
  =
  等于
  >
  大于
  <
  小于
  >=
  大于等于
  <=
  小于等于
  <>
  不等于
  !
  非
  
  通配符
  解释
  示例
  _
  一个字符
  ALike'C_'
  %
  任意长度的字符
  BLike'CO_%'
  []
  括号中所指定范围内的一个字符
  CLike'9W0'
  [^]
  不在括号中所指定范围内的一个字符
  DLike'%[^1-2]'
  13.查询语句:select列名from表名where条件如:select*fromstudentswhereno=1
  14.插入数据行:insert<表名>[列名]values<值列表>
  例:intsetintostudents(name,address,grade,email,sex)
  Values('长青菜','上海松江',5,'zqc@souhu.com','男')
  注意:(不能为标识列指定值,因为它的数字是自动增长的)
  15.更新数据行:update<表名>set<列名=更新值>
  例:updatestudents
  Setaddress='石家庄'
  Whereaddress='保定'
  16.删除数据行:deletefrom<表名>
  例:deletefromstudentinfowhereno='180108225'
  17.问题:如果标识列A的初始值为1,增长量为2,则输入三行数据以后,再删除两行,下次再输入数据行的时候,标识值从多少开始?(7)
  18.删除列:altertablestudentdropcolumnaddress
  19.Exists:ifexists(select*from?wherename='yuanDB')dropdatabasestuDB
  20.变量:局部变量(必须以标记@作为前缀)
  全局变量(必须以标记@@作为前缀)
  全局变量由系统定义和维护,我们只能读取,不能修改全局变量的值。
  21.局部变量声明:例:Decalre@namevachar(8)decare@seatint
  赋值:set@变量名=值或select@变量名=值set@name='张三'
  Select@name=snamefromstudentswhereno='1'
  22.逻辑控制语句:IF-ELSE语句
  If(条件)
  Begin
  语句1
  语句2...........
  End
  Else
  Begin
  语句1
  语句2.........
  End注:else是可选的。
  例:decalre@myavgfloat
  Select@myavg=AVG(course)fromscore
  Print'平均分'+convert(varchar(5),@myavg)
  If(@myavg>70)
  Begin
  Print'本班成绩优秀,前三名成绩为:'
  Selecttop3*fromscoreorderbyscoredesc
  End
  Else
  Begin
  Print'本班成绩较差,后三名成绩为:'
  Selecttop3*fromscoreorderbyscore
  End
  23.while循环语句:while(条件)
  Begin
  语句1
  语句2..........
  Break
  End
  例:DECLARE@nint
  WHILE(1=1)--条件永远成立
  BEGIN
  SELECT@n=COUNT(*)FROMscore
  WHEREscore<60--统计不及格人数
  IF(@n>0)
  UPDATEscore--每人加2分
  SETscore=score+2
  ELSE
  BREAK--退出循环
  END
  print'加分后的成绩如下:'
  SELECT*FROMscore
  
  24.case--end多分支语句
  语法:case
  When条件1then结果1
  When条件2then结果2
  ..............
  Else其他结果
  End
  例:print'ABCDE五级显示成绩如下:'
  SelectstudentID,
  成绩=case
  Whenscore<60then'E'
  Whenscorebetween60and69then'D'
  Whenscorebetween70and79then'C'
  Else'A'
  End
  Fromscore
  25.批处理语句示例:
  SELECT*FROMstuInfo
  SELECT*FROMstuMarks
  UPDATEstuMarks
  SETwrittenExam=writtenExam+2
  GO
  26.习题及答案:
  习题内容:则根据如下规则对成绩进行反复加分,直到平均分超过85分为止。请编写T-SQL语句实现。
  90分以上:不加分
  80-89分:加1分
  70-79分:加2分
  60-69分:加3分
  60分以下:加5分
  习题答案:
  SELECT*FROMscore--原始成绩
  DECLARE@labAvgint
  WHILE(1=1)
  BEGIN
  UPDATEscore
  SETscore=
  CASE
  WHENscore<60THENscore+5
  WHENscorebetween60AND69THENscore+3
  WHENscorebetween70AND79THENscore+2
  WHENscorebetween80AND89THENscore+1
  ELSEscore
  END
  SELECT@labAvg=AVG(score)FROMscore
  IF@labAvg>=85
  BREAK
  END
  SELECT*FROMscore--加分后的成绩
  27.把一个表中的数据复制到另一个表中:insertinto<表名>(列名)
  Select<列名>
  From<源表名>
  28.把查询结果放在新表中同时插入新的标识列:
  Select列名identity(数据类型,标识种子,标识增长量)as
  列名into新表from原始表
  例:selectstudents.sname,students.saddress,students.semail,identity(int,1,1)asstudentIDintotongxunlufromstudents
  29.更新数据行:
  语法:update<表名>
  Set<列名=更新值>
  Where<更新条件>
  例:updatestudents
  Setaddress='软件学校'
  Whereaddress='软件学院'
  30.问题:按多列排序:例:selectno,name,address,grade
  Fromstudents
  Wheresexin(1,0)
  Orderbyno,grade
  31.字符串函数:
  Replace:selectreplace('莫勒可切.杨可','可',‘兰’)
  返回结果:莫勒兰切.杨兰
  Upper:selectupper('sqlserver课程')
  返回结果:SQLSERVER课程
  Getdate:selectgetdate()获取当前时间。
  Dateadd:selectdateadd(mm,4,'01/01/2009')
  返回结果:05/01/2009
  Datename:selectdatename(dw,'01/15/2000')
  返回结果:Saturday
  32.聚合函数:
  Max-min:selectAVG(score)as平均成绩,MAX(score)as最高分,MIN(score)as最低分fromscorewherescore>=60
  Count:selectcount(*)as及格人数fromscore
  Wherescore>=60
  33.分组查询:selectcourseid,avg(score)as课程平均成绩
  Fromscore
  Groupbycourseid
  34.习题:
  假如成绩单中记录了学生的几次考试成绩,要查询每位学生的每门课的总成绩,怎么查?Selectcourseid,studentid,sum(score)as总成绩
  Fromscore
  Groupbycourseid,studentid
  35.分组查询--HAVING
  Having:指定了组或聚合的搜索条件,常常与groupby子句一起使用。
  例:selectstudentidas学员编号,avg(score)as平均成绩
  Fromscore
  Groupbystudentid,couseid
  Havingavg(score)>60
  36.多表查询——内联结例:selectstudents.smame,score.courseid,score.score
  Fromstudents,score
  Wherestudents.scode=score.studentid
  37.多表联结——三表联结例:selectS.nameas姓名,CS.coursenameas课程,C.scoreas成绩fromstudentsAsS
  InnerJoinscoreasCON(S.scode=C.studentid)
  InnerjoincourseAsCSON(CS.courseid=C.courseid)
  38.多表联结查询——右外联结
  例:selecttitles.title_id,Titles.title,publishers.pub_name
  Fromtitles
  Rightouterjoinpublishers
  Ontitles.pub_id=publishers.pub_id
  39.银行案例——多表联结——左外联结:
  例:intsertintoaccount(account.Cardid,account.score)
  Selectusers.cardid,2
  Fromusers
  LeftJoinaccountON(account.cardid=users.cardid)
  Whereaccount.cardidisNULL
  40.子查询:例:select*fromstudents
  Wherescode>(selectscodefromstudentswhereSname='张扬')
  GO
  41.例:内联结(等值联结)selectsnamefromstudents
  InnerJoinscore
  ONstudents.scode=score.studentid
  Wherescore=60GO
  42.局部变量:例:将姓名为里斯的学生的学号,出生日期和平均成绩分别赋给局部变量@no_str@birthday_str@avgrade_num(用select语句来实现)
  Select@no_str=s_no,@birthday_str=s_birthday,@avgrade_num=s_avgrade
  Fromstudentwheres_name=’里斯’
  43.自连接查询:例:(注:student2为不存在,是创建的)
  Selectstudent2.sno学号,student2.sname姓名,student2.ssex性别,student2.sspeciality专业,student2.savgrade平均成绩
  Fromstudent,student2
  Wherestudent.sname=’李好’andstudent.sspeciality=student2.sspeciality
  44.声明局部变量:declare@变量名数据类型
  45.if语句例:查询学号为457865的学生,如果成绩及格,则打印其姓名和成绩。
  Declare@no,char(8),@namechar(8),@avgradenumeric(3,1)
  Set@no=’457865’
  Select@name=sname,@avgrade=savgrade
  Fromstudent
  Wheresno=@no;
  If@avgrade>60.0
  Begin
  Print@name
  Print@avgrade
  End
  Go
  46.if-else语句:对于给定学号的查询,如果平均成绩不及格则打印姓名和平均成绩,否则打印学号。
  Declare@nochar(8),@namechar(8),@avgradenumeric(3,1);
  Set@no=’567’;
  Select@name=sname,@avgrade=savgrade
  Fromstudent
  Wheresno=@no;
  If@avgrade<60.0
  Begin
  Print@name
  Print@avgrade
  End
  Else
  Print@no
  Go
  47.多分支的if语句查询并实现分等级打印学生成绩
  Declare@nochar(8),@namechar(8),@avgradenumeric(3,1);
  Set@no=’567’;
  Select@name=sname,@avgrade=savgrade
  Fromstudent
  Wheresno=@no;
  If@avgrade>=90.0
  Print‘优秀’
  Elseif@avgrade>=80.0
  …………….
  Elseprint‘不及格’
  Go
  48.case语句使用select语句查询学生的学号,然后用case函数对学生的姓名和爱好进行简要说明。Select学号=sno,姓名及爱好=
  Casesno
  When‘123’then‘李好,游泳’
  。。。。。。。
  Else‘没有这人’
  End
  Fromstudent
  49.while语句
  (如果学生平均成绩低于85分,则循环执行对每位学生成绩加0.5%,在循环过程中,如果最高成绩超过95分则退出循环;在加分过程中,当成绩的平均成绩大于或等于80分时打印出当前成绩的平均成绩)
  Declare@avgradenumeric(3,1);
  Set@avgrade=(selectavg(savgrade)fromstudent)
  While@avgrade<85
  Begin
  Updatestudent
  Setsavgrade=savgrade+savgrade*0.005
  Set@avgrade=(selectavg(savgrade)fromstudent)
  If@avgrade>95
  Break--退出循环
  if@avgrade<80
  continue--结束本次循环
  print@avgrade
  End
  50.子查询:查询成绩刚好通过60分的学生
  Selectsnamefromstudents
  InnerJoinscore---内连接
  ONstudents.scode=score.studentid
  Wherescore=60
  Go
  51.事务的特性:原子性、一致性、隔离性、永久性。
  事务分类:显示事务、隐性事务、自动提交事务。
  52.系统存储过程的名称都以“sp_”开头或“xp_”开头。
  EXECsp_databases列出当前系统的数据库
  EXECsp_helpstudents查看表students的信息
  53.定义存储过程的语法:
  Createproc存储过程名
  @参数1数据类型=默认值output,
  ...................
  @参数n数据类型=默认值output
  As
  SQL语句
  Go(注:参数可选,参数分输入参数、输出参数,输入参数允许有默认值)
  54.创建不带参数的存储过程:例:
  Creatprocedurepro_stu
  As
  Declare@myAvgfloat
  Select@myAvg=AVG(score)
  Fromscore
  Print'平均分:'+convert(varchar(5),@myAvg)
  If(@myAvg>70)
  Print'本班考试成绩:优秀'
  Else
  Print'本班考试成绩:较差'
  Print'-----------------------------------------------------------'
  Print'参加本次考试没有通过的学员:'
  Selectname,scode,score
  FromstudentsinnerJoinscoreon
  Students.scode=score.studentidwherescore<60GO
  55.调用存储过程:语法:EXEC过程名[参数]例:EXECproc_stu
  56.输入参数的默认值:例:
  Createprocedureproc_stuMn
  @scorePassint=60---及格线默认为60分
  As
  Print'及格线:'+convert(varchar(5),@scorePass)
  Print'参加本次考试没有通过的学员:'
  Selectname,scode,score
  Fromstudents
  InnerJoinscore
  Onstudents.scode=score.studentid
  Wherescore<@scorePass
  Go
  57.调用带参数默认值的存储过程:
  EXECproc_stu-------采用默认值
  EXECproc_stu55------不采用默认值
  EXECproc_stu@scorePass=55
  58.带输出参数的存储过程:
  Createprocedureproc_stuM
  @notpassSumintoutput,
  @scorePassint=60
  As
  Print'及格线:'+convert(varchar(5),@scorePass)
  Print'参加本次考试没有通过的学员:'
  Selectname,scode,scorefromstudents
  InnerJoinscoreOnstudents.scode=score.studentid
  Wherescore<@scorePass
  Select@notpassSum=count(studentid)
  Fromscorewherescore<@scorePass
  GO
  59.调用带输出参数的存储过程:(注:调用时必须带output关键字,返回结果将存放在变量@sum 中)
  Declare@sumint
  EXECproc_stuM@sumoutput,60
  Print'--------------------------------------------------'
  If@sum>=3
  Print'未通过人数:'+convert(varchar(5),@sum )+'人,超过60%,及格分数线还应下调'
  Else
  Print'未通过人数:'+convert(varchar(5),@sum )+'人,已控制在60%以下,及格分数线适中'
  GO
  60.错误处理:
  使用Raiserror语句:
  Createprocedurepro_stuM
  @notpassSumintoutput,
  @scorePassint=60
  As
  If(not@scorePassbetween0and100)
  Begin
  Raiserror('及格线错误,请指定0—100之间的分数,统计中断退出',16,1)--------引发系统错误,指定错误的严重级别16,调用状态为1(默认),并影响@@ERROR 系统变量的值
  Return--------立即返回,退出存储过程
  End
  ...............其他语句同上例
  Go
  61.使用raiserror语句
  Declare@sumint,@tint
  EXECproc_stum@sumoutput,604----笔试及格线误输入604分
  Set@t=@@error
  Print'错误号:'+convert(varchar(5),@t )
  If@t<>o
  Return------退出批处理,后续语句不再执行
  Print'-----------------------------------'-----如果执行了raiseerror语句,系统全局@@error 将不等于0,表示出现了错误.
  If@sum>=3
  Print'未通过人数:'+convert(varchar(5),@sum)+'人,超过了60%,及格分数线还应下调'
  Elseprint'未通过人数:'+convert(varchar(5),@sum)+'人,已控制在60%以下,及格分数线适中'GO
  62.调用存储过程:例:
  Declare@sint
  Execproc_stuinfo'张三',@s,30———错误!应为(execproc_stuinfo'张三',@soutput,30)
  Execproc_stuinfo'张三',@s————错误!应为(execproc_stuinfo'张三',@soutput)
  Execproc_stuinfo@sAge=22,@stuName='李四',@m=@soutput(正确!)
  63.带输出参数的存储过程:例:
  Declare@sumint
  Execproc_stuM@sumoutput,60
  Print'-----------------------------------------'
  If@sum>=3
  Print'未通过人数:'+convert(varchar(5),@sum )+'人,超过60%,及格分数线还应下调'
  Else
  Print'未通过人数:'+convert(varchar(5),@sum )+'人,已控制在60…60%以下,及格分数线适中'GO
  64.创建触发器语法:Createtriggertrigger_name
  Ontable_name
  --------表示加密触发器定义的SQL文本
  For-------指定触发器类型
  As
  T_SQL语句
  GO
  65.Insert触发器例:
  Createtriggertrig_transInfo
  OntransInfo
  Forinsert
  As
  Declare@typechar(4),@outMoneyMoney
  Declare@myCardIDchar(10),@balanceMoney
  Declare@currentMoneymoney
  Select@type=transType,@outMoney=transMoney,@myCardID=cardIDfrominserted
  If(@type='支取')
  UpdatebanksetcurrentMoney=currentMoney-@outMoney
  WherecardID=@myCardID
  Else
  UpdatebanksetcurrentMoney=currentMoney+@outMoney
  WherecardID=@myCardID
  66.插入一条语句例:
  InsertintotransInfo(transType,transMoney,cardID)
  Values('支取',200,'10011001')
  67.Delete触发器示例:
  Createtriggertri_delete_transInfo
  OntransInfo
  Fordelete
  As
  Print'开始备份数据,请稍候......'
  Ifnotexists(select*fromsysobjectswherename='backupTable')
  Select*intobackupTablefromdeleted------------从deleted表中获取被删除的交易记录。
  Else
  InsertintobackupTableselect*fromdeleted
  Print'备份数据成功,备份表中的数据为:'
  Select*frombackupTable
  Select*fromtransInfo
  GO
  68.Update触发器:
  Createtriggertrig_update_bank
  Onbank
  Forupdate
  As
  Declare@beforeMoneyMoney,@afterMoneyMoney
  Select@beforeMoney=currentMoneyfromdeleted-------(从deleted表中获取交易前的金额,从inserted表中获取交易后的余额)
  Select@afterMoney=currentMoneyfrominserted
  IfABS(@afterMoney-@beforeMoney)>20000------交易金额是否>2万
  Begin
  Print'交易金额:'+convert(varchar(8),
  ABS(@afterMoney-@beforeMoney))
  Raiserror('每笔交易不能超过2万元,交易失败',16,1)
  Rollbacktransaction------------回滚事务,撤销交易
  End
  Go
  69.列级update触发器
  Createtriggertrig_update_transIfo
  ONtransInfo
  Forupdate
  As
  Ifupdate(transDate)
  Begin-------检查是否修改了交易日期列transDate
  Print'交易失败......'
  Raiserror('安全警告:交易日期不能修改,由系统自动产生',16,1)
  Rollbacktransaction----------回滚事务,撤销交易
  End
  GO
  70.数据库阶段数据管理的主要特点:1.采用数据模型表示复杂的数据结构;2.有较高的数据独立性;3.为用户提供了方便的用户接口;4.提供数据控制功能;5.增加系统的灵活性。
  71.DB(数据库):存储在计算机内有组织的、统一管理的相关数据的集合。
  DBMS(数据库管理系统):位于用户与操作系统之间的数据管理软件。
  DBS(数据库系统):是实现有组织的、动态的存储大量关联数据,以方便用户访问计算就硬件、软件和株距资源组成的计算机系统。
  72.物理数据独立性和逻辑数据独立性:
  物理数据独立性:内模式的修改,只需对模式/内模式映象做相应修改,而不需修改概念模式。逻辑数据独立性:概念模式的修改,只需对外模式/模式映象做相应修改,而不
  需修改外模式。
  73.DBMS的主要功能:
  数据定义(DDL):三级结构、两级映象、完整性约束等。数据操纵(DML):检索、更新。数据保护:数据恢复、并发控制、完整性控制、安全性控制等。数据维护:数据载入、转换、存储、、性能监控等。数据字典(DD):存储三级结构定义的数据库称为DD,即系统数据库。DBMS主要功能:数据库定义功能、数据存取功能、数据库运行管理功能、数据库的建立和维护功能。
  74.--1、创建存储过程--
  ifexists(select*fromsysobjectswherename='Sum_wage')
  dropprocedureSum_wage
  GO
  createprocedureSum_wage
  @PWageint,
  @AWageint,
  @totalint
  as
  while(1=1)
  begin
  if(selectcount(*)fromProWage)>2*(selectcount(*)fromProWagewhereWage>=@PWage)
  updateProWageset@total=@total+@AWage,Wage=Wage+@AWage
  else
  break
  end
  print'一共加薪:'+convert(varchar,@total)+'元'
  print'加薪后的程序员工资列表:'
  select*fromProWage
  --调用存储过程1--
  execSum_wage@PWage=2000,@AWage=100,@total=0
  execSum_wage@PWage=2200,@AWage=100,@total=0
  execSum_wage@PWage=3000,@AWage=100,@total=0
  execSum_wage@PWage=4000,@AWage=100,@total=0
  execSum_wage@PWage=5000,@AWage=100,@total=0
  execSum_wage@PWage=6000,@AWage=100,@total=0
  75.
  ifexists(select*fromsysobjectswherename='Avg_wage')
  dropprocedureAvg_wage
  GO
  createprocedureAvg_wage
  @PWageint,
  @AWageint,
  @totalint
  as
  while(1=1)
  begin
  if((selectAvg(Wage)fromProWage)<=@PWage)
  updateProWageset@total=@total+@AWage,Wage=Wage+@AWage
  else
  break
  end
  print'一共加薪:'+convert(varchar,@total)+'元'
  print'加薪后的程序员工资列表:'
  select*fromProWage
  --调用存储过程--
  execAvg_wage@PWage=3000,@AWage=200,@total=0
  execAvg_wage@PWage=4500,@AWage=200,@total=0
  76.代码:
  INSERTINTOstudentinformation(S_name,S_no,S_grade,S_address)
  VALUES('花无影',25,'软件0802班','河北')
  
  
  selectstudentinformation.S_name,studentinformation.S_no
  intoinformation2
  fromstudentinformation
  
  
  selectS_no,S_grade,S_name
  fromstudentinformation
  whereS_school='软件学院'
  orderbyS_no
  
  
  
  selectS_no,S_name,S_class
  fromstudentinformation
  whereS_sex='男'andS_name<>'花无影'
  orderbyS_no
  
  
  
  
  SELECTtop20percentsnameas姓名,snoas学号,saddressas地址
  FROMyuan
  WHEREsschool='软件学院'
  ORDERBYsnoasc,snamedesc
  
  
  
  
  selectcharindex('data','mydataisset',1)(data的索引位置)
  selectlen('javaxuexibiji')(字符串长度)
  selectlower('BAODINGDIANLIZHIYEJISHUXUEYUAN')(转换成小写)
  selectreplace('软件学院','软件学院','软件工程学院')(替换)
  selectstuff('abcdefghijklmn',3,6,'今天的学习内容')(从第三字符个开始替换,替换6个字符)
  
  
  
  
  selectgetdate()(当前日期)
  selectdateadd(dd,250,'04/12/2009')(250天后的日期)
  selectdatediff(mm,'04/20/2005','08/05/2010')(相差的月数)
  selectdatename(dw,'04/12/2009')(返回星期几)
  selectdatepart(dd,'04/12/2009')(返回当天是几号)
  selectabs(-10)绝对值
  selectceiling(-32.8)返回大于或等于该数的最小整数
  selectpower(102,3)取数值表达式的幂值
  selectround(3.141592653,4)(?)将数值表达式四舍五入成指定精度
  selectsign(1000)正数返回1,负数返回-1,0返回0.
  selectsqrt(6.25)//返回该数据的平方根
  selectconvert(varchar(100),45678932)//转变数据类型
  selectcurrent_user//返回当前用户的名字
  selectdatalength('软件学院')//返回字符长度
  selecthost_name()   //返回用户登录的计算机名
  selectsystem_user//返回登录的用户名
  selectuser_name(1)//从任意数据库中返回dbo(jizhu)
  
  
  
  createprocpro_stu
  @scorepassfloat
  as
  print'学号'+convert(varchar(5),@scorepass)
  selectname
  fromstuent
  wherestudent.score=@scorepass
  go
  execpro_stu@scorepass=85
  
  
  76.导出SQLServer数据库中数据:
  declare@objectIdint
  set@objectId=object_id('sun')
  if@objectIdisnotnull
  begin
  dropprocsun
  end
  go
  
  createprocsun(@tablenamevarchar(256))
  as
  begin
  setnocounton
  declare@sqlstrvarchar(4000)
  declare@sqlstr1varchar(4000)
  declare@sqlstr2varchar(4000)
  select@sqlstr='select''insert'+@tablename
  select@sqlstr1=''
  select@sqlstr2='('
  select@sqlstr1='values(''+'
  select@sqlstr1=@sqlstr1+col+'+'',''+',@sqlstr2=@sqlstr2+name+','from(selectcase
  whena.xtype=173then'casewhen'+a.name+'isnullthen''NULL''else'+'convert(varchar('+convert(varchar(4),a.length*2+2)+'),'+a.name+')'+'end'
  whena.xtype=104then'casewhen'+a.name+'isnullthen''NULL''else'+'convert(varchar(1),'+a.name+')'+'end'
  whena.xtype=175then'casewhen'+a.name+'isnullthen''NULL''else'+'''''''''+'+'replace('+a.name+','''''''','''''''''''')'+'+'''''''''+'end'
  whena.xtype=61then'casewhen'+a.name+'isnullthen''NULL''else'+'''''''''+'+'convert(varchar(23),'+a.name+',121)'+'+'''''''''+'end'
  whena.xtype=106then'casewhen'+a.name+'isnullthen''NULL''else'+'convert(varchar('+convert(varchar(4),a.xprec+2)+'),'+a.name+')'+'end'
  whena.xtype=62then'casewhen'+a.name+'isnullthen''NULL''else'+'convert(varchar(23),'+a.name+',2)'+'end'
  whena.xtype=56then'casewhen'+a.name+'isnullthen''NULL''else'+'convert(varchar(11),'+a.name+')'+'end'
  whena.xtype=60then'casewhen'+a.name+'isnullthen''NULL''else'+'convert(varchar(22),'+a.name+')'+'end'
  whena.xtype=239then'casewhen'+a.name+'isnullthen''NULL''else'+'''''''''+'+'replace('+a.name+','''''''','''''''''''')'+'+'''''''''+'end'
  whena.xtype=108then'casewhen'+a.name+'isnullthen''NULL''else'+'convert(varchar('+convert(varchar(4),a.xprec+2)+'),'+a.name+')'+'end'
  whena.xtype=231then'casewhen'+a.name+'isnullthen''NULL''else'+'''''''''+'+'replace('+a.name+','''''''','''''''''''')'+'+'''''''''+'end'
  whena.xtype=59then'casewhen'+a.name+'isnullthen''NULL''else'+'convert(varchar(23),'+a.name+',2)'+'end'
  whena.xtype=58then'casewhen'+a.name+'isnullthen''NULL''else'+'''''''''+'+'convert(varchar(23),'+a.name+',121)'+'+'''''''''+'end'
  whena.xtype=52then'casewhen'+a.name+'isnullthen''NULL''else'+'convert(varchar(12),'+a.name+')'+'end'
  whena.xtype=122then'casewhen'+a.name+'isnullthen''NULL''else'+'convert(varchar(22),'+a.name+')'+'end'
  whena.xtype=48then'casewhen'+a.name+'isnullthen''NULL''else'+'convert(varchar(6),'+a.name+')'+'end'
  whena.xtype=165then'casewhen'+a.name+'isnullthen''NULL''else'+'convert(varchar('+convert(varchar(4),a.length*2+2)+'),'+a.name+')'+'end'
  whena.xtype=167then'casewhen'+a.name+'isnullthen''NULL''else'+'''''''''+'+'replace('+a.name+','''''''','''''''''''')'+'+'''''''''+'end'
  else'''NULL'''
  endascol,a.colid,a.name
  fromsyscolumnsawherea.id=object_id(@tablename)anda.xtype<>189anda.xtype<>34anda.xtype<>35anda.xtype<>36
  )torderbycolid
  select@sqlstr=@sqlstr+left(@sqlstr2,len(@sqlstr2)-1)+')'+left(@sqlstr1,len(@sqlstr1)-3)+')''from'+@tablename
  print@sqlstr
  exec(@sqlstr)
  setnocountoff
  end
  go
页: [1]
查看完整版本: SQL Server 2005基础知识整理