目录
替换
replace(字符串,被替换的字符,替换的字符)
例如:
select replace(replace(replace('2012年5月18日','年','-'),'日',' '),'月','-');
创建数据库
create database question1 on primary ( name='question1_data', filename='C:\temp\question1_data.mdf', size=5MB, maxsize=10MB, filegrowth=10% ) log on ( name='question1_log', filename='C:\temp\question1_log.ldf', size=5MB, maxsize=10MB, filegrowth=15% )
创建表
use question1; create table city( CityCode Char(4) primary key, //主键 CityName Varchar(80) not null //非空 ) create table publishers( PubCode Char(4) primary key, PubName Char(5) not null, Phone Char(15), Address Varchar(100), CityCode Char(4) foreign key references city(CityCode) //外键 )
修改表
use question1; //添加列 alter table publishers add comment Varchar(100) //修改列长度 alter table publishers alter column comment Varchar(120) //删除列 comment alter table publishers drop column comment
删除表
//先删有外键的表 drop table publishers; drop table city;
对表进行crud操作
use examdb; //插入数据 insert into publishers(PubCode,PubName,Phone,Address,CityCode) values('ZLTC','蓝天出版社','020-83546627','越秀区果戈里大街12号','AGZ') //更改数据 update titles set Price=36 where TitleCode='T012' //删除数据 delete publishers where PubCode='ZLTC' //查询数据,排序 order by asc:升序, desc:降序 select * from titles order by Price desc //查询数据, 去除重复列 distinct select distinct CityCode from publishers //数据筛选,使用别名,按条件查询 select TitleName 名称,Author 作者,Price as 价格 from titles where CategoryID=1 //数据筛选,查询examDB数据库的titles表中出版日期在2009年至2010年的出版记录,并按出版日期升序排序。order by默认升序 select * from titles where year(PubDate)>=2009 and YEAR(PubDate)<=2010 order by PubDate //模糊查询,查询examDB数据库的titles表中出版物名称包含“数据库”的出版记录 select * from titles where TitleName like '%数据库%' //模糊查询,查询examDB数据库的titles表中出版社代码第二位是“X”的出版物名称、作者和出版社代码 select TitleName,Author,PubCode from titles where PubCode like '_X__' //查询中使用算术运算符:查询examDB数据库中titles表的价格超过35的出版物名称、价格和85折后的价格 select TitleName 书名, Price 全价, Price*0.85 as '85折' from titles where price>35
字符串函数
print len('HI-你好!')--返回6 print datalength('123A你好!') --返回10 print datalength(N'123A你好!')--返回16 使用unicode数字和字母都占两个字节 3.upper()--小写转换大写 4.lower()--大写转换小写 5.ltrim() 去掉左端空格,rtrim()去掉右边空格 6.left('NIHAOYAP,2') 从左边截取2个字符 7.right('NIAH',2)从右边截取2个字符 8.substring('nihaooo',1,2)--从位置1截取两个字符,结果ni, 下标是从1开始的。 print substring('nihaooo',-1,3)--结果返回n ,下表-1,0是空值 //,查询examDB数据库中titles表的出版物名称长度大于7的TitleCode、TitleCode的后三位、后一位和出版物名称及名称、长度,并按长度降序排列 //RTRIM() 去尾部空格,LTRIM 去头部空格 select TitleCode,right(RTRIM(TitleCode),3) Id1,right(RIRTM(TitleCode),1) Id2, TitleName,len(TitleName) from titles where len(TitleName)>7 order by len(TitleName) desc
数学函数
--1、ABS(X)绝对值函数; SELECT ABS(-2.0),ABS(2); --2、PE()返回圆周率的函数; SELECT PI(); --3、SQRT(X)平方根函数; SELECT SQRT(9),SQRT(11); --4、RAND()和RAND(X)函数:返回一个随机浮点值n(0<=n<=1.0); SELECT RAND(),RAND(),RAND(); ----不带参数时生成的随机数不同; SELECT RAND(5),RAND(5),RAND(3);--带相同的参数时生成相同的随机数; --5、ROUND(X,Y)函数:四舍五入,返回最接近于参数X的值,其值保留到小数点后Y位,若Y为负数,则小数点左起Y位均为0; SELECT ROUND(33333.333333,2),ROUND(33333.33333,-2),ROUND(33333,-2); --6、SIGN(X)函数:返回参数的符号; SELECT SIGN(3),SIGN(0),SIGN(-3),SIGN(3.33),SIGN(-33.33); --7、CEILING(X)函数:返回不小于X的最小整数; SELECT CEILING(33.333),CEILING(33.666),CEILING(-33.333),CEILING(-33.666); --8、FLOOR(X)函数:返回比X小的最大整数; SELECT FLOOR(33.333),FLOOR(-33.333); --9、POWER(X,Y)函数:返回x的y次方; SELECT POWER(2,3),POWER(3,0),POWER(5,-2),POWER(5.0,-2),POWER(5.000,-2); --10、SQUARE(X)函数:返回x的平方; SELECT SQUARE(0),SQUARE(3),SQUARE(-3),SQUARE(3.3); --11、EXP(X)函数:返回e的x乘方; SELECT EXP(3),EXP(-3),EXP(0),EXP(3.3); --12、LOG(X)函数:返回x的自然对数,x不能为0和负数; SELECT LOG(3.3),LOG(3),LOG(4); --13、LOG10(X)函数:返回x的基数为10的对数,如100的基数为10的对数是2; SELECT LOG10(1000),LOG10(1),LOG10(5); --14、RADIANS(X)函数:将参数x由角度转换为弧度; SELECT RADIANS(45.0),RADIANS(45),RADIANS(-45.0); --15、DEGREES(X):函数:将参数x由弧度转换为角度; SELECT DEGREES(33),DEGREES(33.33333),DEGREES(-33.33333),DEGREES(PI()); --16、SIN(X)函数:返回x的正弦,x为弧度值; SELECT SIN(30),SIN(-30),SIN(PI()),SIN(PI()/2),ROUND(SIN(PI()),0); --17、ASIN(X)函数:返回x的反正弦,即返回正弦为x的值; SELECT ASIN(1),ASIN(0),ASIN(-1); --18、COS(X)函数:返回x的余弦,x为弧度值; SELECT COS(30),COS(-30),COS(PI()),COS(1),COS(0); --19、ACOS(X)函数:返回x的反余弦,即返回余弦为x的值; SELECT ACOS(1),ACOS(0),ACOS(-1),ACOS(0.3434235),ROUND(ACOS(0.3434235),1); --20、TAN(X)函数:返回x的正切,x为弧度值; SELECT TAN(1),TAN(0),TAN(-1); --21、ATAN(X)函数:返回x的反正切,即返回正切为x的值; SELECT TAN(1),ATAN(1.5574077246549),ATAN(0); ------TAN和ATAN互为反函数; --22、COT(X)函数:返回x的余切; SELECT COT(3),1/TAN(3),COT(-3);--------------------COT和TAN互为倒数;//返回小于或等于以下两个数的整数:4.5和-7.6;返回大于或等于8.1的整数;返回2的5次幂 select FLOOR(4.5),FLOOR(-7.6) ,CEILING(8.1),POWER(2,5);
日期函数
1.Current_Timestamp :返回当前系统时间 --无参数 --返回datetime类型 select Current_Timestamp as 当前系统时间 --2019-09-22 23:46:53.623 2.Dateadd():在日期中添加或减去指定的时间间隔 --语法:Dateadd(datepart,number,date) --datepart:要将其与整数值相加的 date 的一部分 --number:时间间隔数,可以是正数也可以是负数 --date:日期 --返回datetime类型 select Dateadd(dd,3,Getdate()) --返回当前时间加三天 select Dateadd(mm,-3,Getdate())--返回当前时间减三个月 3.Datediff():返回时间差 --语法Datediff(datepart,startdate,enddate) --datepart:用于报告 startdate 与 enddate 之间差异的单位 --startdate:开始日期 --enddate:结束日期 --返回int类型 select Datediff(dd,'2019-07-01','2019-07-25')--返回24 select Datediff(mm,'2019-11-01','2019-10-10')--返回-1 4.Datename():返回表示指定日期的指定日期部分的字符串 --语法:Datename(datepart,date) --返回字符串类型 select Datename(dd,getdate())--获取当前日 select Datename(mm,getdate())--获取当前月份 select Datename(yy,getdate())--获取当前年份 5.Datepart():返回表示指定日期的指定日期部分的整数 --语法:Datepart(datepart,date) --返回int类型 select Datepart(day,getdate())--获取当天 select Datepart(month,getdate())--获取当前月份 select Datepart(year,getdate())--获取当前年份 6.Day():返回表示指定日期的“日”日期部分的整数 --语法:Day(datetime) --返回int类型 select Day(getdate())--返回当前日 select Day('2019-09-22')--返回22 7.Getdate():返回当前系统的日期和时间 --语法:Getdate() --返回datetime类型 select Getdate() 8.Getutcdate():返回当前UTC(通用协调时,世界标准时间)时间 --语法:Getutcdate() --返回datetime类型 select Getutcdate()--北京时间减八个小时 9.Isdate():确定输入表达式是否为有效的日期,返回1代表true,0代表false --语法:Isdate(varchar) --返回int类型 select Isdate('2019-20-01')--返回0 select Isdate('2019-01-01')--返回1 10.Month():返回指定日期的“月”部分的整数 --语法:Month(datetime) --返回:int类型 select Month(getdate())--返回当前月份 select Month('2019-07-01')--返回7 11.Sysdatetime():返回当前系统时间的 datetime2(7) 值 --语法:Sysdatetime() --返回datetime2(7) select Sysdatetime() 12.Sysdatetimeoffset():返回当前系统时间的datetimeoffset(7)值,包含时区偏移量 --语法:Sysdatetimeoffset() --返回datetimeoffset类型 select Sysdatetimeoffset() 13.Sysutcdatetime():返回当前UTC(世界标准时间)的datetime2(7)值 --语法:Sysutcdatetime() --返回:datetime2(7)类型 select Sysutcdatetime() 14.Switchoffset():将datetimeoffset值从保留的时区偏移量改为新值 --语法:Switchoffset(datetimeoffset,时区) --datetimeoffset:表达式式 --时区:varchar --返回datetimeoffset DECLARE @dt datetimeoffset = switchoffset (CONVERT(datetimeoffset, GETDATE()), '-04:00') SELECT * FROM table_name WHERE dt2> @dt Option (Recompile) --重新编译、提高性能 15.Todatetimeoffset():返回从 datetime2 表达式转换的 datetimeoffset 值 --语法:Todatetimeoffset(expression,时区) --返回datetimeoffset类型 DECLARE @todaysDateTime datetime2 SET @todaysDateTime = GETDATE() SELECT Todatetimeoffset (@todaysDateTime, '-07:00') 16.Year():返回指定日期的“年”部分的整数 --语法:Year(datetime) --返回int类型 select Year(getdate())--当前年份 17.Datepart参数://返回当前系统日期,返回两个日期“2008-01-01”和“2009-01-01”之间的月份数 yy返回年数 mm返回月数,dd返回天数 select GETDATE(),DATEDIFF(mm,'2008-01-01','2009-01-01')
聚合函数
1、COUNT合计函数: 返回查询记录(行)数。
格式:
COUNT([ALL|DISTINCT] [表达式|*])参数说明:
ALL:默认值,指对查询所有记录统计总数。
DISTINCT:指对查询记录去重非空记录的总数。
表达式:指除了text、image、ntext以外任何类型的表达式;
*:表示查询记录总的行数。
2、SUM 求和函数: 计算表中数值列的数据合计值。
格式:
SUM([ALL|DISTINCT] 表达式)ALL:默认值,指对查询所有记录求和。
DISTINCT:指对查询记录去重后求和。
表达式:常量、数据列、函数与算术运算的任意组合。
用法:
SELECT SUM(score) FROM T_Score SELECT SUM(DISTINCT score) FROM T_Score SELECT SUM(1+99) 3、AVG 求平均值函数: 返回数据列表中的平均值,NULL被忽略。
格式:
AVG([ALL|DISTINCT] 列名(数值类型))参数:ALL:表示所有不为NULL的列,DISTINCT去重的列。
用法:
SELECT AVG(Age) FROM T_User --求平均年龄 SELECT AVG(DISTINCT Age) FROM T_User -- 去重之后求平均年龄 4、MAX/MIN: 求出表中任意列中数据的最大/小值。
格式:
MAX/MIN(列名)用法:
SELECT MAX(score) FROM T_Score SELECT MIN(score) FROM T_Score 5、COUNT_BIG 合计函数: 用法和COUNT类似,唯一的区别在于COUNT_BIG返回的值类型为bigint,COUNT返回的值类型为int。
6、GROUPING 函数 作用:新增一个附加列。如果grouping()函数返回1则指示聚合;返回0则指示不聚合。
用法:
SELECT GROUPING(name),name from T_User GROUP BY name
//查询examDB数据库的titles表中所有出版物的平均价格 select avg(Price) from titles; //在SELECT语句中使用GROUP BY:新建查询窗口,输入查询语句,实现在examDB数据库publishers表中统计各城市的出版社数量 select count(*) as 出版社数量,citycode from publishers group by CityCode order by count(*) //在SELECT语句中使用HAVING(与GROUP BY一起使用):新建查询窗口,输入查询语句,实现在examDB数据库publishers表中统计各城市出版社数量超过1的城市 select CityCode from publishers group by CityCode having count(*)>1
多表查询
--连接查询 --查询客户名称,采购数量,采购单价,商品名称 --方法一:内连接:inner join 语法: select 列名1,列名2... from 表名1 inner join 表名2 on (外键表.外键=主键表.主键) --查询客户名称,采购数量,采购单价,商品名称 select clientName,productNumber,salePrice,productName from sales inner join product on(sales.productId=product.productId) --查询客户名称,商品名称,商品报价 select clientName,productName,price from sales s inner join product p on(s.productId=p.productId) --方法二:通过等值连接实现内连接查询: select 列名1,列名2... from 表名1,表名2 where 外键表.外键=主键表.主键 select clientName,productName,price from sales s,product p where s.productId=p.productId --查询单笔销售数量>20的商品名称,销售单价和销售数量 select productName,salePrice,productNumber from product inner join sales on(product.productId=sales.productId) where productNumber>20 select productName,salePrice,productNumber from product,sales where product.productId=sales.productId and productNumber>20 --empdb use empdb select * from dept select * from emp --查询员工姓名,性别,地址及部门名称和部门人数 select empName,empSex,empAddress,deptName,deptNum from emp inner join dept on(emp.deptId=dept.deptId) --查询姓名中出现"凯歌"的员工姓名,性别,地址及部门名称和部门人数 select empName,empSex,empAddress,deptName,deptNum from emp inner join dept on(emp.deptId=dept.deptId) where empName like '%凯歌%' select empName,empSex,empAddress,deptName,deptNum from emp,dept where emp.deptId=dept.deptId and empName like '%凯歌%'//在一个SELECT语句中使用多个表(内联接):新建查询窗口,输入查询语句,查询examDB数据库中每个城市(city表中的CityName)的出版社名称(publishers表中) select CityName,pubName from city inner join publishers on(city.CityCode=publishers.CityCode) //在SELECT语句中使用子查询:新建查询窗口,输入查询语句,查询examDB数据库的publishers表中价格最高的出版物名称、作者和出版日期 select TitleName,Author,PubDate from titles where Price=(select max(Price) from titles) //使用UNION运算符的集合运算:新建查询窗口,输入查询语句,查询examDB数据库publishers表中CityCode为“AGZ”的出版社信息:包括PubCode、PubName、Phone、CityCode的记录集合,与CityCode为“HBJ”的出版社信息:包括PubCode、PubName、Phone、CityCode的记录集合,进行并集运算 select PubCode,PubName,Phone,CityCode from publishers where CityCode='AGZ' union select PubCode,PubName,Phone,CityCode from publishers where CityCode='HBJ'
变量
局部变量
以“@”开头的标识符表示变量(局部变量),该变量必须先用DECLARE命令声明后才能使用:
DECLARE @js_age int; DECLARE @name varchar(32), @address varchar(64);使用DECLARE命令并创建局部变量后,初始值为NULL,可以使用SELECT或SET命令这只局部变量的值, 示例1:声明、赋值、输出:
DECLARE @js_age INT SELECT @js_age = 28 SELECT @js_age AS 年龄 GO
示例2:通过查询语句给变量赋值:
DECLARE @js_rows INT SET @js_rows = (SELECT COUNT(*) FROM PERSON) SELECT @js_rows as 行数 GO
示例3:使用由SET赋值的局部变量进行查询:
USE test GO DECLARE @js_address VARCHAR(64) SET @js_address = 'AAAAA' SELECT RTRIM(FirstName) + ' ' + RTRIM(LastName) AS Name, @js_address AS ADDRESS FROM PERSON GO
全局变量
在SQL Server中,全局变量是一种特殊类型的变量,服务器将维护这些变量的值。全局变量以@@前缀开头,不必进行声明,它们属于系统定义的函数。
@@CONNECTIONS 返回 SQL Server 自上次启动以来尝试的连接数。 @@CPU_BUSY 返回 SQL Server 自上次启动后的工作时间。 @@CURSOR_ROWS 返回连接上打开的上一个游标中的当前限定行的数目, 确定当其被调用时检索了游标符合条件的行数。 @@DATEFIRST 针对会话返回 SET DATEFIRST 的当前值,SET DATEFIRST 表示指定的 每周的第一天。 @@DBTS 返回当前数据库的当前 timestamp 数据类型的值, 这一时间戳值在数据库中必须是唯一的。 @@ERROR 返回执行的上一个 Transact-SQL 语句的错误号, 如果前一个 Transact-SQL 语句执行没有错误,则返回 0。 @@FETCH_STATUS 返回针对连接当前打开的任何游标发出的上一条游标 FETCH 语句的状态。 @@IDENTITY 返回上次插入的标识值。 @@IDLE 返回 SQL Server 自上次启动后的空闲时间。结果以 CPU 时间 增量或“时钟周期”表示,并且是所有 CPU 的累积。 @@IO_BUSY 返回自从 SQL Server 最近一次启动以来,Microsoft SQL Server 已经用于执行输入和输出操作的时间。其结果是 CPU 时间增量 (时钟周期),并且是所有 CPU 的累积值 @@LANGID 返回当前使用的语言的本地语言标识符 (ID)。 @@LANGUAGE 返回当前所用语言的名称。 @@LOCK_TIMEOUT: 返回当前会话的当前锁定超时设置(毫秒)。 @@MAX_CONNECTIONS 返回 SQL Server 实例允许同时进行的最大用户连接数。 返回的数值不一定是当前配置的数值。 @@MAX_PRECISION 按照服务器中的当前设置,返回 decimal 和 numeric 数据类型 所用的精度级别。 @@NESTLEVEL 返回对本地服务器上执行的当前存储过程的嵌套级别(初始值为 0)。 @@OPTIONS 返回有关当前 SET 选项的信息。 @@PACK_RECEIVED 返回 SQL Server 自上次启动后从网络读取的输入数据包数。 @@PACK_SENT 返回 SQL Server 自上次启动后写入网络的输出数据包个数。 @@PACKET_ERRORS 返回自上次启动 SQL Server 后,在 SQL Server 连接上发生的网络 数据包错误数。 @@PROCID 返回 Transact-SQL 当前模块的对象标识符 (ID)。Transact-SQL 模块可以是存储过程、用户定义函数或触发器。 @@REMSERVER 返回远程 SQL Server 数据库服务器在登录记录中显示的名称。 @@ROWCOUNT 返回受上一语句影响的行数。 @@SERVERNAME 返回运行 SQL Server 的本地服务器的名称。 @@SERVICENAME 返回 SQL Server 正在其下运行的注册表项的名称。若当前实例为 默认实例,则 @@SERVICENAME 返回 MSSQLSERVER。 @@SPID 返回当前用户进程的会话 ID。 @@TEXTSIZE 返回 SET 语句中的 TEXTSIZE 选项的当前值。 @@TIMETICKS 返回每个时钟周期的微秒数。 @@TOTAL_ERRORS 返回 SQL Server 自上次启动之后所遇到的磁盘写入错误数。 @@TOTAL_READ 返回 SQL Server 自上次启动后读取磁盘(不是读取高速缓存)的次数。 @@TOTAL_WRITE 返回 SQL Server 自上次启动以来所执行的磁盘写入次数。 @@TRANCOUNT 返回当前连接的活动事务数。 @@VERSION 返回当前的 SQL Server 安装的版本、处理器体系结构、生成日期 和操作系统。
使用print一起输出数值和字符串
要输出在同一行的话那肯定就要使得输出类型一致,也就是说输出的字符串和数值类型要一致,显然让数值转换成字符串是更简单的事情,因此我们可以用上print @p+convert(varchar,@q) 其中@p是字符串类型,@q是数值类型
DECLARE @vname Char(10); DECLARE @vnum int; set @vname = '张三'; set @vnum = 12; print '局部变量:' + '@vname:'+@vname+'@vnum:'+convert(varchar,@vnum) print '全局变量:' + '@@Language(当前所用语言的名称):'+ @@Language;
cast函数
内置函数
语法: CAST (expression AS data_type) 参数说明: expression:任何有效的SQServer表达式。 AS:用于分隔两个参数,在AS之前的是要处理的数据,在AS之后是要转换的数据类型。 data_type:目标系统所提供的数据类型,包括bigint和sql_variant,不能使用用户定义的数据类型。注意事项: (1).CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。以下例子用于将文本字符串'12'转换为整型: SELECT CAST('12' AS int) (2).返回值是整型值12。如果试图将一个代表小数的字符串转换为整型值,又会出现什么情况呢? SELECT CAST('12.5' AS int) (3).CAST()函数和CONVERT()函数都不能执行四舍五入或截断操作。由于12.5不能用int数据类型来表示,所以对这个函数调用将产生一个错误: Server: Msg 245, Level 16, State 1, Line 1 Syntax error converting the varchar value '12.5' to a column of data type int. (4).要返回一个合法的数值,就必须使用能处理这个值的数据类型。对于这个例子,存在多个可用的数据类型。如果通过CAST()函数将这个值转换为decimal类型,需要首先定义decimal值的精度与小数位数。在本例中,精度与小数位数分别为9 与2。精度是总的数字位数,包括小数点左边和右边位数的总和。而小数位数是小数点右边的位数。这表示本例能够支持的最大的整数值是9999999,而最小的小数是0.01。 SELECT CAST('12.5' AS decimal(9,2)) decimal数据类型在结果网格中将显示有效小数位: 12.50 (5).精度和小数位数的默认值分别是18与0。如果在decimal类型中不提供这两个值,SQL Server将截断数字的小数部分,而不会产生错误。 SELECT CAST('12.5' AS decimal) 结果是一个整数值:12使用select输出语句输出出版物代码的值和其对应的使用CAST函数转换后以字符形式输出的价格 select TitleCode,TitleName,Author,CateGoryID,PubCode,CAST(Price as varchar) 'Price',PubDate from titles;
视图
CREATE VIEW <视图名> [(<列名>[,<列名>]...)] AS <子查询> [WITH CHECK OPTION] //删除视图 drop view 视图名
注意:
当我们SQL Server在创建视图时 ,会出现"create view 必须是批处理中仅有的语句"这个语法错误提示 ,实际上这本身没什么错! 因为create view 必须是批处理中的第一条语句。也就是说,你可能在这段代码之前还有其他的语句是同时处理的,为此,你可以在这段代码的前一行加上GO,在这段代码结束后一行加上GO就可以了。。或者你把这段代码单独执行就不会出错了。
--实现在examDB数据库中titles表上创建名为view1的视图,查询2010年后出版的出版物的TitleName、Author、Price和PubDate。 --创建成功后,保存视图并用SELECT语句查看视图所包含的列 use examDB; go create view view1 as select TitleName,Author,Price,PubDate from titles where year(PubDate)>2010 go select * from view1;创建复杂视图:新建查询窗口,输入Transact-SQL语句,实现在examDB数据库中创建名为view2的视图,视图实现按类别ID(Category表)和类别名称(Category表)分组统计各类出版物(TitleCode)的数量。 use examDB; go create view view2 as select category.CategoryID as '类别ID',category.CategoryName '类别名称',count(TitleCode) 数量 from category left outer join titles on category.CategoryID=titles.CategoryID group by category.CategoryID,category.CategoryName go select * from view2 注意:最后group by 分组CategoryID和CategoryName都需要,因为 ID和Name是一一对应的
索引
//创建索引 create index 索引名 on 表名(字段) //删除索引 drop index 表名.索引在表titles的pubdate字段上建立名为newidx的索引 create index newidx on titles(Pubdate)
存储过程
create proc 存储过程名 @输入参数 数据类型,@输出参数 数据类型 output as begin 存储过程的主体 end; //调用存储过程 EXEC <过程名> <入参值> [,<入参值>]...//存储过程实现在city表中cityName为“北京”、在publishers表中查询该城市的pubName 和Address,即查询城市名是“北京”的出版社名称和出版社地址 create proc sproc1 as begin select pubName,Address from publishers inner join city on city.CityCode=publishers.CityCode where city.CityName='北京' end; exec sproc1;//实现在examDB数据库中新建名为sproc2的存储过程。该存储过程包括一个输入参数,用来表示cityName。该存储过程实现在city表中给定不同的cityName,在publishers表查询该城市的pubName和Address。 use examDB; go create proc sproc2 @cname varchar(80) as begin select pubName,Address from publishers inner join city on publishers.CityCode =city.CityCode where city.CityName = @cname end exec sproc2 '北京'实现在examDB数据库中新建名为sproc3的存储过程。该存储过程包括一个输入参数和一个输出参数:输入参数表示TitleCode,输出参数表示Price。该存储过程实现在titles表中根据不同的出版物代码,求出其对应的Price。 use examDB; go create proc sproc3 @tc char(6) , @p money output as begin select @p=Price from titles where TitleCode=@tc end go declare @p money exec sproc3 'T002',@p output; use examDB; go create proc sproc3 @tc char(6) , @p money output as begin select @p=Price from titles where TitleCode=@tc end go declare @p money exec sproc3 'T002',@p output print 'T002的价格是' + convert(varchar,@p); 注意: exec sproc3 'T002',@p output 与 print 'T002的价格是' + convert(varchar,@p); 之间 不要加分号
触发器
create trigger 触发器名 on 表名 (after,before) (insert,delete,update) as begin if 条件:update(PubDate) begin 内容 end; end;//实现在examDB数据库中建立名为newtrigger的触发器。触发器规定当titles表的PubDate列的数据发生变化时,显示“出版日期已更改,触发器起到作用。”文本。修改titles表的PubDate列数据以触发该触发器 use examDB; go create trigger newtrigger on titles after update as begin if update(PubDate) begin print '出版日期已修改,触发器起到作用' end end; update titles set PubDate= '2011-06-02' where TitleCode='T001'
数据库用户
创建数据库登录账户 exec sp_addLogin 账户名 账户密码 创建数据库用户 exec sp_grantDBaccess 登录账户 用户名给数据库用户授权 grant (select,update,delete,…) on 表名 to 用户名创建数据库登录帐户:新建查询窗口,输入Transact-SQL语句,使用系统存储过程sp_addLogin创建SQL Server身份的登录账户:登录名为Login1,密码为123456 exec sp_addLogin 'Login1','123456'创建数据库用户:新建查询窗口,选择数据库examDB,输入Transact-SQL语句,使用系统存储过程sp_grantdDBaccess在该数据库中创建数据库用户dbUser1(默认登录名为Login1,也可以不同) exec sp_grantdDBaccess 'Login1','dbUser1'授予数据库用户dbUser1对publishers表具有select和update对象权限 grant select,update on publishers to dbUser1