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语句创建数据库:

CREATEDATABASE[ApressFinacial]ONPRIMARY

(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权限[on表名]to数据库用户

例:grantselectinsertupdate

Onstudentstozhangsan

10.T-SQL语句创建登录名:

Createlogin[yuan]

Withpassword='130125'

Go

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

12.T-SQL中的运算符:

运算符

含义

=

等于

>

大于

<

小于

>=

大于等于

<=

小于等于

<>

不等于

!

通配符

解释

示例

_

一个字符

ALike'C_'

%

任意长度的字符

BLike'CO_%'

[]

括号中所指定范围内的一个字符

CLike'9W0[1-2]'

[^]

不在括号中所指定范围内的一个字符

DLike'%[A-Z][^1-2]'

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

14.插入数据行:insert[into]<表名>[列名]values<值列表>

例:intsetintostudents(name,address,grade,email,sex)

Values('长青菜','上海松江',5,'zqc@souhu.com','男')

注意:(不能为标识列指定值,因为它的数字是自动增长的)

15.更新数据行:update<表名>set<列名=更新值>[where<更新条件>]

例:updatestudents

Setaddress='石家庄'

Whereaddress='保定'

16.删除数据行:deletefrom<表名>[where<删除条件>]

例: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

When123then李好,游泳

。。。。。。。

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[edure]存储过程名

@参数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

[withencryption]--------表示加密触发器定义的SQL文本

For[delete,insert,update]-------指定触发器类型

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值