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]