当前位置: 代码迷 >> SQL >> SQL Server 2005基础知识详细收拾
  详细解决方案

SQL Server 2005基础知识详细收拾

热度:46   发布时间:2016-05-05 12:07:29.0
SQL Server 2005基础知识详细整理
SQL Server 2005中的基础知识。

1. ACID:指数据库事务正确执行的四个基本要素缩写:
1.原子性2.一致性3.隔离性4.持久性

2.数据库对象:表(table) 视图(view) 存储过程(stored procedure) 函数(function)索引(index)

3.SQL Server 2005中包含master、model、msdb、tempdb四个系统数据库。

4.使用T-SQL语句创建数据库:
CREATE DATABASE [ApressFinacial] ON  PRIMARY( NAME = N'ApressFinacial', FILENAME = N'I:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ApressFinacial.mdf' , SIZE = 3072KB , FILEGROWTH = 1024KB )LOG ON( NAME = N'ApressFinacial_log', FILENAME = N'I:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ApressFinacial_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)


5.T-SQL语句删除数据库:drop database[数据库名]

6.常见的约束类型:主键约束、唯一约束、检查约束、默认约束、外键约束。

7.添加约束的语法:
         Alter table 表名
         Add  constraint  约束名 约束类型 具体的约束说明

8.删除约束:alter table 表名
            Drop constraint 约束名

9.授权语法:  grant 权限[on  表名] to 数据库用户
         例:grant  select  insert  update
              On students  to  zhangsan

10.T-SQL语句创建登录名:
           Create  login[yuan]
            With  password='130125'
            Go

11.数据库完整性分为:实体完整性、域完整性、参照完整性、用户自定义完整性。

12.T-SQL 中的运算符:
运算符
含义

=
等于

>
大于

<
小于

>=
大于等于

<=
小于等于

<>
不等于

!


通配符
解释
示例

_
一个字符
A Like 'C_'

%
任意长度的字符
B Like 'CO_%'

[]
括号中所指定范围内的一个字符
C Like '9W0[1-2]'

[^]
不在括号中所指定范围内的一个字符
D Like '%[A-Z][^1-2]'

13.查询语句:select 列名  from 表名  where 条件   如:select*  from students  where       no=1

14.插入数据行:insert  [into]<表名> [列名]values<值列表>
       例:intset into students(name,address,grade,email,sex)
           Values('长青菜','上海松江',5,'www.jbxue.com','男')
      注意:(不能为标识列指定值,因为它的数字是自动增长的)

15.更新数据行:update <表名> set<列名=更新值>    [where<更新条件>]
      例:update  students
          Set  address='石家庄'
          Where   address='保定'

16.删除数据行:  delete  from<表名>[where<删除条件>]
       例:delete from  studentinfo     where  no='180108225'

17.问题:如果标识列A的初始值为1,增长量为2,则输入三行数据以后,再删除两行,下次再输入数据行的时候,标识值从多少开始?      (  7  )

18.删除列: alter  table  student     drop  column  address

19.Exists:     if  exists (select*from?where  name='yuanDB')  drop  database stuDB

20.变量:   局部变量([email protected]
            全局变量(必须以标记@@作为前缀)
       全局变量由系统定义和维护,我们只能读取,不能修改全局变量的值。

21.局部变量声明:  例:Decalre  @name  vachar(8)      decare @seat  int
   赋值:set @[email protected]=值  set @name='张三'
           Select @name=sname  from  students  where  no='1'

22.逻辑控制语句: IF-ELSE语句
            If(条件)
              Begin
              语句1
              语句2...........
              End
            Else
            Begin
            语句1
            语句2.........
            End        注:else是可选的。

例: decalre @myavg float
     Select @myavg =AVG(course) from score
     Print'平均分'+convert(varchar(5),@myavg)
     If(@myavg>70)
     Begin
     Print '本班成绩优秀,前三名成绩为:'
      Select  top 3 * from  score  order  by score  desc
      End
      Else
        Begin
        Print  '本班成绩较差,后三名成绩为:'
        Select  top 3 *from  score  order  by  score
       End

23.while循环语句:   while(条件)
                     Begin
                     语句1
                     语句2..........
                     Break
                     End
       例:DECLARE @n int
           WHILE(1=1) --条件永远成立
           BEGIN
           SELECT @n=COUNT(*) FROM score
           WHERE score<60    --统计不及格人数
           IF (@n>0)
           UPDATE score     --每人加2分
            SET score=score+2
          ELSE
          BREAK    --退出循环
          END
          print '加分后的成绩如下:'
          SELECT * FROM score

24.case--end多分支语句
      语法:    case
                When  条件1  then  结果1
                When  条件2  then  结果2
                ..............
                 Else  其他结果
                 End
       例:print  'ABCDE五级显示成绩如下:'
           Select  studentID,
               成绩=case
                        When  score<60  then'E'
                        When   score  between  60  and  69  then 'D'
                        When   score  between  70  and  79  then 'C'
                         Else  'A'
                      End
                     From  score

25.批处理语句示例:
                   SELECT * FROM stuInfo
                   SELECT * FROM stuMarks
                   UPDATE stuMarks
                      SET writtenExam=writtenExam+2
                   GO

26.习题及答案:  
        习题内容:则根据如下规则对成绩进行反复加分,直到平均分超过85分为止。请编写T-SQL语句实现。
90分以上:   不加分
80-89分:   加1分
70-79分:   加2分
60-69分:   加3分
60分以下:   加5分
习题答案:
SELECT * FROM score --原始成绩DECLARE @labAvg  intWHILE(1=1) BEGIN    UPDATE score      SET score=        CASE            WHEN score<60 THEN score+5            WHEN score between 60 AND 69 THEN score+3            WHEN score between 70 AND 79 THEN score+2            WHEN score between 80 AND 89 THEN score+1            ELSE score        END     SELECT @labAvg=AVG(score) FROM score       IF  @labAvg>=85           BREAK ENDSELECT * FROM score --加分后的成绩


27.把一个表中的数据复制到另一个表中:  insert  into <表名>(列名)
                                       Select  <列名>
                                       From <源表名>

28.把查询结果放在新表中同时插入新的标识列:
           Select  列名  identity(数据类型,标识种子,标识增长量)as
            列名  into  新表    from  原始表
  例:   select   students.sname, students.saddress,  students.semail,  identity(int,1,1) as  studentID    into  tongxunlu    from students

29.更新数据行:
      语法:  update<表名>
              Set<列名=更新值>
              Where <更新条件>
       例: update  students
             Set   address='软件学校'
              Where  address='软件学院'

30.问题:按多列排序:例:select  no,name,address,grade
                   From   students
                   Where   sex  in(1,0)
                   Order by   no,grade

31.字符串函数:
    
 Replace:    select  replace('莫勒可切.杨可','可',‘兰')          返回结果:莫勒兰切.杨兰      Upper:    select  upper('sql server 课程')       返回结果:SQL SERVER 课程      Getdate:   select  getdate()获取当前时间。       Dateadd:   select  dateadd(mm,4,'01/01/2009')        返回结果:05/01/2009      Datename:     select  datename(dw,'01/15/2000')       返回结果:   Saturday


32.聚合函数:
Max-min:     select  AVG(score) as  平均成绩,MAX(score) as 最高分,MIN(score) as最低分       from  score          where  score>=60
Count:    select  count(*)as  及格人数      from  score
                      Where   score>=60

33. 分组查询:


select  courseid,avg(score) as 课程平均成绩
                From  score
                Group  by  courseid

34.习题: 
假如成绩单中记录了学生的几次考试成绩,要查询每位学生的每门课的总成绩,怎么查?
Select  courseid,studentid,sum(score) as 总成绩                From  score                Group  by  courseid,studentid


35.分组查询--HAVING
Having:指定了组或聚合的搜索条件,常常与group by子句一起使用。
例:
select  studentid  as学员编号,avg(score)as 平均成绩                  From   score                  Group  by  studentid,couseid                  Having  avg(score)>60


36.多表查询——内联结   
例:


select  students.smame, score.courseid, score.score
                              From  students,score
                              Where  students.scode=score.studentid

37.多表联结——三表联结   
例:


select  S.name  as姓名,CS.coursename as课程,C.score as 成绩                         from  students  As S
                                Inner Join score  as C  ON(S.scode=C.studentid)
                                Inner join  course  As CS  ON(CS.courseid=C.courseid)

38.多表联结查询——右外联结 
例:
select  titles.title_id,Titles.title,publishers.pub_name               From  titles               Right outer  join  publishers               On  titles.pub_id=publishers.pub_id


39.银行案例——多表联结——左外联结:
例:
  intsert  into  account(account.Cardid,account.score)                Select  users.cardid,2                From users                Left  Join account  ON(account.cardid=users.cardid)                Where  account.cardid  is NULL


40.子查询:
例:
select * from  students                 Where  scode>(select  scode  from  students  where  Sname='张扬')                  GO


41.例:内联结(等值联结)
select  sname  from  students                           Inner  Join  score                           ON  students.scode=score.studentid                           Where  score=60      GO


42.局部变量:
例:将姓名为里斯的学生的学号,出生日期和平均成绩分别赋给局部变量
@no_str @birthday_str @avgrade_num  (用select语句来实现)


             Select  @no_str=s_no,@birthday_str=s_birthday,@avgrade_num=s_avgrade
              From student          where  s_name='里斯'

43.自连接查询:   
例:(注:student2为不存在,是创建的)
 Select  student2.sno学号,student2.sname姓名,student2.ssex性别,student2.sspeciality专业,student2.savgrade平均成绩               From student,student2               Where  student.sname='李好' and student.sspeciality=student2.sspeciality


44.声明局部变量:declare  @变量名  数据类型

45.if语句 例:查询学号为457865的学生,如果成绩及格,则打印其姓名和成绩。
         Declare @no,char(8),@name char(8),@avgrade numeric(3,1)         Set @no='457865'         Select @name=sname,@avgrade=savgrade         From student         Where [email protected];         If @avgrade>60.0         Begin         Print @name         Print @avgrade         End         Go


46.if-else语句:对于给定学号的查询,如果平均成绩不及格则打印姓名和平均成绩,否则打印学号。
          Declare @no char(8),@name char(8),@avgrade numeric(3,1);          Set @no='567';          Select @name=sname,@avgrade=savgrade          From student          Where  [email protected];          If @avgrade<60.0          Begin          Print @name          Print @avgrade          End          Else          Print @no          Go


47.多分支的if语句查询并实现分等级打印学生成绩
       
  Declare @no char(8),@name char(8),@avgrade numeric(3,1);          Set @no='567';          Select @name=sname,@avgrade=savgrade          From student          Where  [email protected];          If @avgrade>=90.0          Print ‘优秀'          Else if @avgrade>=80.0          …………….          Else print ‘不及格'          Go


48.case 语句   使用select语句查询学生的学号,然后用case函数对学生的姓名和爱好进行简要说明。  
 Select  学号=sno,姓名及爱好=              Case sno              When ‘123' then ‘李好,游泳'              。。。。。。。              Else ‘没有这人'              End              From  student


49.while语句
      (如果学生平均成绩低于85分,则循环执行对每位学生成绩加0.5%,在循环过程中,如果最高成绩超过95分则退出循环;在加分过程中,当成绩的平均成绩大于或等于80分时打印出当前成绩的平均成绩)
     Declare @avgrade numeric(3,1);            Set @avgrade=(select  avg(savgrade) from student)            While @avgrade<85             Begin                      Update student                        Set savgrade=savgrade+savgrade*0.005                      Set @avgrade=(select avg(savgrade) from student)                      If @avgrade>95                         Break                            --退出循环                      [email protected]<80                      continue                             --结束本次循环                      print @avgrade                      End


50.子查询:查询成绩刚好通过60分的学生
            
 Select sname from students                  Inner  Join  score                ---内连接                   ON students.scode=score.studentid                   Where  score=60                    Go

51.事务的特性:原子性、一致性、隔离性、永久性。
  事务分类:显示事务、隐性事务、自动提交事务。

52.系统存储过程的名称都以“sp_”开头或“xp_”开头。
        EXEC sp_databases     列出当前系统的数据库
        EXEC sp_help students  查看表students的信息

53.定义存储过程的语法: 
             Create  proc[edure]  存储过程名
              @参数1  数据类型=默认值 output,
               ...................
              @参数n  数据类型=默认值 output
              As
              SQL语句
              Go (注:参数可选,参数分输入参数、输出参数,输入参数允许有默认值)

54.创建不带参数的存储过程:   
例:
         
 Creat  procedure  pro_stu           As           Declare  @myAvg float           Select  @myAvg=AVG(score)           From score           Print '平均分:'+convert(varchar(5),@myAvg)           If(@myAvg>70)              Print '本班考试成绩:优秀'            Else               Print '本班考试成绩:较差'            Print '-----------------------'            Print '参加本次考试没有通过的学员:'               Select  name,scode,score                   From students inner Join score  on                   Students.scode=score.studentid     where  score<60     GO

55.调用存储过程:   语法:   EXEC  过程名[参数]    例:EXEC proc_stu

56.输入参数的默认值:   
例:
Create procedure  proc_stuMn            @scorePass  int=60        ---及格线默认为60分         As            Print '及格线:' +convert(varchar(5),@scorePass)            Print '参加本次考试没有通过的学员:'          Select  name,scode,score                From students                Inner Join score                On students.scode=score.studentid                 Where score<@scorePass         Go

57.调用带参数默认值的存储过程:
             EXEC proc_stu    -------采用默认值
             EXEC proc_stu 55    ------不采用默认值
             EXEC proc_stu  @scorePass=55

58.带输出参数的存储过程:
Create procedure proc_stuM        @notpassSum  int  output,        @scorePass  int=60        As            Print'及格线:'+convert(varchar(5),@scorePass)           Print '参加本次考试没有通过的学员:'        Select  name,scode,score      from  students              Inner Join score  On   students.scode=score.studentid                   Where  score<@scorePass         Select @notpassSum=count(studentid)               From score where score<@scorePass         GO


59.调用带输出参数的存储过程:(注:调用时必须带output关键字,[email protected] 中)
    Declare @sum int           EXEC proc_stuM @sum output,60           Print '--------------------------------------------------'           If @sum>=3                 Print '未通过人数:'+convert(varchar(5),@sum )+'人,超过60%,及格分数线还应下调'           Else                  Print '未通过人数:'+convert(varchar(5),@sum )+'人,已控制在60%以下,及格分数线适中'                     GO


60.错误处理: 
使用Raiserror语句:
    Create  procedure  pro_stuM                  @notpassSum  int output,                  @scorePass  int=60            As               If(not  @scorePass  between 0 and 100)                   Begin                   Raiserror('及格线错误,请指定0—100之间的分数,统计中断退出',16,1) --------引发系统错误,指定错误的严重级别16,调用状态为1(默认),并影响@@ERROR 系统变量的值                   Return   --------立即返回,退出存储过程             End               ...............其他语句同上例             Go


61.使用raiserror语句
     
    Declare  @sum int,@t int          EXEC proc_stum @sum  output, 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%,及格分数线还应下调'           Else   print '未通过人数:'+convert(varchar(5),@sum)+'人,已控制在60%以下,及格分数线适中'              GO62.调用存储过程:         例:               Declare  @s  int               Exec proc_stuinfo  '张三' ,@s , 30    ———错误!应为(exec proc_stuinfo '张三',@s  output,30)                Exec proc_stuinfo '张三' ,@s     ————错误!应为(exec proc_stuinfo '张三',@s output)                Exec proc_stuinfo  @sAge=22,@stuName='李四',@[email protected] output(正确!)


63.带输出参数的存储过程: 
例:
    
      Declare @sum  int           Exec proc_stuM @sum  output,60           Print '-----------------------------------------'           If  @sum>=3              Print'未通过人数:'+convert(varchar(5),@sum )+'人,超过60%,及格分数线还应下调'           Else                Print'未通过人数:'+convert(varchar(5),@sum )+'人,已控制在60…60%以下,及格分数线适中'       GO


64.创建触发器语法:  

Create  trigger  trigger_name                       On  table_name                       [with  encryption] --------表示加密触发器定义的SQL文本                       For [delete,insert,update]    -------指定触发器类型                       As                         T_SQL语句                       GO   


65.Insert 触发器 
例:
    
  Create trigger  trig_transInfo       On  transInfo        For  insert        As        Declare  @type  char(4),@outMoney  Money        Declare  @myCardID  char(10),@balance  Money        Declare  @currentMoney  money        Select  @type=transType,@outMoney=transMoney,@myCardID=cardID from inserted              If(@type='支取')                   Update  bank  set  [email protected]                   Where  [email protected]              Else                    Update  bank  set  [email protected]                   Where  [email protected]

66. 插入一条语句   
例:
          Insert  into  transInfo(transType,transMoney,cardID)          Values ('支取',200,'10011001')67. Delete触发器示例:            Create  trigger  tri_delete_transInfo            On  transInfo            For  delete            As                Print '开始备份数据,请稍候......'                If  not  exists(select * from  sysobjects  where  name='backupTable')                Select * into backupTable  from  deleted        ------------从deleted表中获取被删除的交易记录。                 Else                    Insert  into backupTable  select * from  deleted                    Print '备份数据成功,备份表中的数据为:'                    Select * from  backupTable                    Select * from  transInfo                GO   


68. Update 触发器:
         
  Create  trigger  trig_update_bank            On  bank            For  update            As                 Declare  @beforeMoney  Money,@afterMoney  Money                Select  @beforeMoney=currentMoney  from  deleted   -------(从deleted表中获取交易前的金额,从inserted表中获取交易后的余额)                Select  @afterMoney=currentMoney  from  inserted                  If  ABS(@[email protected])>20000 ------交易金额是否>2万                       Begin                          Print '交易金额:'+convert(varchar(8),                          ABS(@[email protected]))                        Raiserror ('每笔交易不能超过2万元,交易失败',16,1)                        Rollback  transaction         ------------回滚事务,撤销交易                        End            Go


69. 列级update触发器
  
      Create  trigger  trig_update_transIfo         ON  transInfo         For  update         As             If  update(transDate)             Begin                -------检查是否修改了交易日期列transDate             Print  '交易失败......'             Raiserror('安全警告:交易日期不能修改,由系统自动产生',16,1)             Rollback  transaction          ----------回滚事务,撤销交易             End         GO

70.数据库阶段数据管理的主要特点:1.采用数据模型表示复杂的数据结构;2.有较高的数据独立性;3.为用户提供了方便的用户接口;4.提供数据控制功能;5.增加系统 的灵活性。

71.   DB(数据库):存储在计算机内有组织的、统一管理的相关数据的集合。
  DBMS(数据库管理系统):位于用户与操作系统之间的数据管理软件。
  DBS(数据库系统):是实现有组织的、动态的存储大量关联数据,以方便用户访问计算就硬件、软件和株距资源组成的计算机系统。

72.物理数据独立性和逻辑数据独立性:
       物理数据独立性:内模式的修改,只需对模式/内模式映象做相应修改,而不需修改        概念模式。逻辑数据独立性:概念模式的修改,只需对外模式/模式映象做相应修改,而不
需修改外模式。

73.  DBMS的主要功能:
        数据定义(DDL):三级结构、两级映象、完整性约束等。数据操纵(DML):检索、更新。数据保护:数据恢复、并发控制、完整性控制、安全性控制等。数据维护:数据载入、转换、存储、、性能监控等。数据字典(DD):存储三级结构定义的数据库称为DD,即系统数据库。DBMS主要功能:数据库定义功能、数据存取功能、数据库运行管理功能、数据库的建立和维护功能。

74.--1、创建存储过程--
if exists (select * from sysobjects where name='Sum_wage')drop procedure Sum_wageGOcreate procedure Sum_wage@PWage int,@AWage int,@total intaswhile (1=1)beginif (select count(*) from ProWage)>2*(select count(*) from ProWage where Wage>[email protected])update ProWage set @[email protected][email protected],[email protected]elsebreakendprint'一共加薪:'+convert(varchar,@total)+'元'print'加薪后的程序员工资列表:'select * from ProWage--调用存储过程1--exec Sum_wage @PWage=2000,@AWage=100,@total=0exec Sum_wage @PWage=2200,@AWage=100,@total=0exec Sum_wage @PWage=3000,@AWage=100,@total=0exec Sum_wage @PWage=4000,@AWage=100,@total=0exec Sum_wage @PWage=5000,@AWage=100,@total=0exec Sum_wage @PWage=6000,@AWage=100,@total=0

75.
if exists (select * from sysobjects where name='Avg_wage')drop procedure Avg_wageGOcreate procedure Avg_wage@PWage int,@AWage int,@total intaswhile (1=1)beginif ((select Avg(Wage) from ProWage)<[email protected])update ProWage set @[email protected][email protected],[email protected]elsebreakendprint'一共加薪:'+convert(varchar,@total)+'元'print'加薪后的程序员工资列表:'select * from ProWage--调用存储过程--exec Avg_wage @PWage=3000,@AWage=200,@total=0exec Avg_wage @PWage=4500,@AWage=200,@total=0


76.代码:
INSERT INTO studentinformation(S_name,S_no,S_grade,S_address)VALUES('花无影',25,'软件0802班','河北')select studentinformation.S_name,studentinformation.S_nointo information2from studentinformationselect S_no,S_grade,S_namefrom studentinformationwhere S_school='软件学院'order by S_noselect S_no,S_name,S_classfrom studentinformationwhere S_sex='男'and S_name<>'花无影'order by S_noSELECT top 20 percent sname as 姓名,sno as 学号,saddress as 地址FROM  yuanWHERE  sschool ='软件学院'ORDER BY  sno asc,sname descselect charindex('data','my data is set',1)    (data的索引位置)select len('java xuexibiji')      (字符串长度)select lower('BAO DING DIANLI ZHI YE JI SHU XUE YUAN')   (转换成小写)select replace('软件学院','软件学院','软件工程学院')  (替换)select stuff('a b c d e f g h i j k l m n',3,6,'今天的学习内容')   (从第三字符个开始替换,替换6个字符)select getdate()   (当前日期)select dateadd(dd,250,'04/12/2009')   (250天后的日期)select datediff(mm,'04/20/2005','08/05/2010')   (相差的月数)select datename(dw,'04/12/2009')    (返回星期几)select datepart(dd,'04/12/2009')    (返回当天是几号)select abs(-10)   绝对值select ceiling(-32.8)    返回大于或等于该数的最小整数select power(102,3)   取数值表达式的幂值select round(3.141592653,4)     (?)将数值表达式四舍五入成指定精度select sign(1000)   正数返回1,负数返回-1,0返回0.select sqrt(6.25)      //返回该数据的平方根select convert(varchar(100),45678932) //转变数据类型 select current_user      //返回当前用户的名字select datalength('软件学院')    //返回字符长度select host_name()   //返回用户登录的计算机名select system_user      //返回登录的用户名select user_name(1)     //从任意数据库中返回dbo(jizhu)create proc pro_stu@scorepass floatasprint '学号'+convert(varchar(5),@scorepass)select namefrom stuentwhere [email protected]goexec pro_stu @scorepass=85


76.导出SQL Server数据库中数据:
declare @objectId intset @objectId=object_id('sun')if @objectId is not nullbegin    drop proc sunendgocreate proc sun (@tablename varchar(256))asbegin    set nocount on    declare @sqlstr varchar(4000)    declare @sqlstr1 varchar(4000)    declare @sqlstr2 varchar(4000)    select @sqlstr='select ''insert [email protected]    select @sqlstr1=''    select @sqlstr2='('    select @sqlstr1='values (''+'    select @[email protected]+col+'+'',''+' ,@[email protected]+name +',' from (select case    when a.xtype =173 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.length*2+2)+'),'+a.name +')'+' end'    when a.xtype =104 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(1),'+a.name +')'+' end'    when a.xtype =175 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end'    when a.xtype =61 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'convert(varchar(23),'+a.name +',121)'+ '+'''''''''+' end'    when a.xtype =106 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.xprec+2)+'),'+a.name +')'+' end'    when a.xtype =62 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(23),'+a.name +',2)'+' end'    when a.xtype =56 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(11),'+a.name +')'+' end'    when a.xtype =60 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(22),'+a.name +')'+' end'    when a.xtype =239 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end'    when a.xtype =108 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.xprec+2)+'),'+a.name +')'+' end'    when a.xtype =231 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end'    when a.xtype =59 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(23),'+a.name +',2)'+' end'    when a.xtype =58 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'convert(varchar(23),'+a.name +',121)'+ '+'''''''''+' end'    when a.xtype =52 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(12),'+a.name +')'+' end'    when a.xtype =122 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(22),'+a.name +')'+' end'    when a.xtype =48 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(6),'+a.name +')'+' end'    when a.xtype =165 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.length*2+2)+'),'+a.name +')'+' end'    when a.xtype =167 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end'    else '''NULL'''    end as col,a.colid,a.name    from syscolumns a where a.id = object_id(@tablename) and a.xtype <>189 and a.xtype <>34 and a.xtype <>35 and a.xtype <>36    )t order by colid    select @[email protected]+left(@sqlstr2,len(@sqlstr2)-1)+') '+left(@sqlstr1,len(@sqlstr1)-3)+')'' from [email protected]    print @sqlstr    exec( @sqlstr)    set nocount offendgo

  相关解决方案