暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

SQL Server语法

婺青年 2022-02-21
603

SQL Server 语法

1 创建数据库

create database 数据库名称
--create database TestDB


2 查看数据库是否存在

IF EXISTS (SELECT 1 FROM SYSDATABASES WHERE NAME='数据库名称') 
select 1
else
select 0;


3 在数据库创建表

-- 在TestDB数据库创建stuInfo学生表,字段:stuSeat座位号,stuName姓名,stuNo学号,stuAge年龄,stuID身价证号码,stuAddress住址
-- 要求座位号是从100开始的自动编号,姓名不能为空,学号不能重复,年龄只能在0-100,stuAddress默认值为“未填写”
if exists(select * from sysobjects where Name='stuInfo')
drop table stuInfo
else
print 'go on'
create table stuInfo(
stuSeat int IDENTITY(100,1), -- 自增长
stuName varchar(100) not null, -- 不允许为空
stuNo int unique,-- 唯一
stuAge int check(stuAge between 0 and 100) , -- 约束
stuID varchar(100),
stuAddress varchar(100) default '未填写'               -- 不能限制not null ,否则会报二进制错误
);
select * from stuInfo;


4 增加stuSex字段

alter table stuInfo add stuSex smallint not null;


5 修改列名

exec sp_rename 'stuInfo.stuName','name','column'


6 删除列

alter table stuInfo drop Constraint CK_stuInfo_stuAge_2EDAF651; -- 由于年龄列存在约束,要先删除约束
alter table stuInfo drop column stuAge;


7 设置列为主键

alter table stuInfo ADD constraint PK_stuSeat PRIMARY KEY (stuSeat);


8 写入数据

insert into stuInfo (Name,stuNo,stuAge,stuID,stuSex) values ('tangxin',1,18,'12365868',1);


9 修改数据

update stuInfo set stuAge=17 where stuID='12365868';


10 删除数据

delete from stuInfo where stuSeat=100;


11 清空表数据

truncate table stuInfo


12 查询表是否存在

if exists(select * from sysobjects where Name='stuInfo')
drop table stuInfo
else
print 'not EXISTS'


13 删除主键约束

exec sp_helpconstraint @objname=stuInfo;    -- 查询所有约束
alter table stuInfo drop Constraint PK_stuSeat;


14 删除数据库

drop database 数据库名称


15 写脚本打印9*9乘法表

declare @x int
set @x=1
declare @y int
declare @c varchar(8000)
while(@x<=9)
begin
select @y=1,@c=''
while(@y<=@x)
begin
select @c=@c+cast(@y as varchar)+'*'+cast(@x as varchar)+'='+cast(@x*@y as varchar)+' '
set @y=@y+1
end
print @c+char(10)
set @x=@x+1
end


16 公共表达式CTE

-- 公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE。递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式。
with cte as (select * from stuInfo)
select * from cte;


17 窗口函数,分区函数

-- 窗口函数除了用于聚集函数sum,count,avg等之外,还有row_number(计算行数),rank(排名),lead() ,lag()前移后移 
select row_number() over (partition by name order by name) as '123',* from stuInfo


18 FOR XML path

-- 将行数据转列
select name from stuInfo
FOR XML Path('')


19 PIVOT和UNPIVOT 行列转换函数

-- PIVOT 行转列
select [100],[101],[105],[106],[107] from
stuInfo
PIVOT
(MAX(Name) For stuSeat in ([100],[101],[105],[106],[107]))P

-- UNPIVOT 列转行
select name,Employee,Orders from
stuInfo
UNPIVOT
(Orders For Employee in (stuNo,stuSeat))P


20 Merge 的应用

Merge INTO stuInfo as T
Using [User] as S
on T.stuNo=S.id
When Matched and S.id=3 -- 匹配时
then Update set T.Name='未填写123'
When Not Matched -- 不匹配的数据 这个条件只能添加
then insert values (s.id,s.name)
When Not matched by source -- 目标表中存在,源表中不存在 这个条件只能删除
then delete;


21 动态sql

文本拼接语句 缺点:容易被注入

-- 实例1
declare @sql nvarchar(1000)
set @sql='select * from stuInfo'
print @sql
-- exec(@sql)
execute(@sql)

-- 实例2
DECLARE @sql NVARCHAR(1000),@i NVARCHAR(50)  
SET @sql=N'select getdate()'
SET @sql=@sql+';select @i'
DECLARE @we NVARCHAR(50)='xi''an'
EXEC sys.sp_executesql @sql,N'@i NVARCHAR(50)',@we             -- 变量必须是unixcode 字符传入

-- 实例3
DECLARE @sql NVARCHAR(1000),@i INT,@j int
SET @sql=N'select getdate()'
SET @sql=@sql+';select @i+@j'
SET @i=500
SET @j=1
EXEC sys.sp_executesql @sql,N'@i INT,@j int',@i,@j


21 Except 和 Intersect

比较两个查询的结果,返回非重复值

-- Except 从左查询中返回右查询没有找到的所有非重复值。
select * from t1
except
select * from t2

-- intersect 查询两张表的交集
select * from t1
intersect
select * from t2


22 case……end

case后面有值,相当于C#中的switch case

select name , -- 注意逗号
  case level -- case后跟条件
      when 1 then '骨灰'
      when 2 then '大虾'
      when 3 then'菜鸟'  
  end as'头衔'
from [user]

case 后面无值,相当于c#中的if...else if...else....

select studentId,
   case
      when english between 80 and 90  then '优'
      when english between 60 and 79  then '良'
      else '差'
   end
from Score


23 if...else

IF(条件表达式)
 BEGIN -- 相当于C#里的{
  语句1
……
 END -- 相当于C#里的}
ELSE
BEGIN
  语句1
  ……
 END

计算平均分数并输出,如果平均分数超过分输出成绩最高的三个学生的成绩,否则输出后三名的学生

declare @avg int -- 定义变量
select @avg= AVG(english) from Score  -- 为变量赋值
select '平均成绩'+CONVERT(varchar,@avg) -- 打印变量的值
   if @avg<60
         begin
             select '前三名'
             select top 3 * from Score order by english desc
         end
   else
        begin
            select '后三名'
            select top 3 * from Score order by english  
        end


24 while循环

WHILE(条件表达式)
 BEGIN -- 相当于C#里的{
  语句
  ……
  BREAK
 END -- 相当于C#里的}

如果不及格的人超过半数(考试题出难了),则给每个人增加分

select * from Score
declare @conut int,@failcount int,@i int=0  -- 定义变量
select @conut =COUNT(*) from Score -- 统计总人数
select @failcount =COUNT(*) from Score where english<100 -- 统计未及格的人数
while (@failcount>@conut/2)
  begin
      update Score set english=english+1
      select @failcount=COUNT(*) from Score where english<100
      set @i=@i+1
  end
select @i
update Score set english=100 where english >100


25 索引

使用索引能提高查询效率,但是索引也是占据空间的,而且添加、更新、删除数据的时候也需要同步更新索引,因此会降低Insert、Update、Delete的速度。只在经常检索的字段上(Where)创建索引。

聚集索引:索引目录中的和目录中对应的数据都是有顺序的

非聚集索引:索引目录有顺序但存储的数据是没有顺序的

-- 语法
CREATE [UNIQUE][CLUSTERED | NONCLUSTERED]  INDEX index_name

ON {table_name | view_name} [WITH [index_property [,....n]]
说明:
UNIQUE: 建立唯一索引。
CLUSTERED: 建立聚集索引。
NONCLUSTERED: 建立非聚集索引。
Index_property: 索引属性。
UNIQUE索引既可以采用聚集索引结构,也可以采用非聚集索引的结构,如果不指明采用的索引结构,则SQL Server系统默认为采用非聚集索引结构。

-- 创建非聚集索引
CREATE NONCLUSTERED INDEX [IX_Student_sNo] ON student
(
   [sNo] ASC
)

-- 删除索引语法
DROP INDEX table_name.index_name[,table_name.index_name]
说明:
table_name: 索引所在的表名称。
index_name : 要删除的索引名称。
                           
-- 显示索引信息                            
Exec sp_helpindex  table_name
                           
-- 重新生成索引
ALTER INDEX 索引名 on 表名 REBUILD

-- 重新组织索引
ALTER INDEX 索引名 on 表名 reorganize
                           


26 分页

-- 分页1
select top 3 * from student
where [sId] not in (select top (3*(4-1)) [sid] from student)-- 4表示页数

select *, row_number() over(order by [sage] desc ) from student-- row_number() over (order by..)获取行号
-- 分页2
select * from
 (select *, row_number() over(order by [sid] desc ) as num from   student)as t
where num between (Y-1)*T+1 and Y*T
order by [sid] desc

-- 分页3
select * from
(select ROW_NUMBER() over( order by [UnitPrice] asc) as num,* from [Books] where [publisherid]=1 )as t
where t.num between 1 and 20  -- 要查询的开始条数和结束条数


27 连接

内连接  inner join...on...
      查询满足on后面条件的数据
外连接    
  左连接
       left join...on...
      先查出左表中的所有数据
      再使用on后面的条件对数据过滤
  右连接
       right join...on...
      先查出右表中的所有数据
      再使用on后面的条件对数据过滤
  全连接
       full join ...on...

*)交叉连接
       cross join 没有on
          第一个表的每一行和后面表的每一行进行连接
          没有条件。是其它连接的基础


28 视图

优点:筛选表中的行 防止未经许可的用户访问敏感数据 降低数据库的复杂程度

-- 创建视图
create view v_Demo
as
select * from t1


29 变量

局部变量

声明变量:使用declare关键字,并且变量名已@开头,@直接连接变量名,中间没有空格。

必须指明变量的类型,同时还可以声明多个不同类型的变量。

declare @name nvarchar(30),@age int

-- 变量赋值:
-- 1、使用set 给变量赋值,只能给一个变量赋值
set @age=18
set @name ='Tianjia'

select @age,@name  -- 输出变量的值

-- 2、使用select 可以同时为多个变量赋值
select @age=19,@name='Laoniu'

-- 3、在查询语句中为变量赋值
declare @sum int =18 -- 为变量赋初值
select @sum= SUM(english) from Score -- 查询语句中赋值
select @sum -- 输出变量值

-- 4、变量作为条件使用

declare @sname nvarchar(10)='张三'
declare @sage int
select @sage=sage from student where sName=@sname
select @sage

-- 5、使用print输出变量值,一次只能输出一个变量的值,输出为文本形式
print @sage


全局变量(系统变量)

select * from student0 
select @@error -- 最后一个T-SQL错误的错误号
select @@identity -- 返回最近一次插入的编号
select @@language -- 当前使用的语言名称
select @@max_connections-- 获取创建的同时连接的最大数目
select @@rowcount -- 受上一个sql语句影响的行数
select @@servername -- 本地服务器的名称
print @@TRANCOUNT -- 当前连接打开的事务数
select @@version -- Sql Server的版本信息


30 事务

-事务:同生共死 访问并可能更新数据库中各种数据项的一个程序执行单元(unit)--也就是由多个sql语句组成,必须作为一个整体执行开始事务:BEGIN TRANSACTION事务提交:COMMIT TRANSACTION事务回滚:ROLLBACK TRANSACTION @@ERROR只能判断当前一条T-SQL语句执行是否有错,为了判断事务中所有T-SQL语句是否有错,我们需要对错误进行累计;

-- 模拟转账
declare @sumError int=0 -- 声明变量

begin tran
update bank set balance=balance-1000 where cId='0001'
set @sumError=@sumError+@@error
update bank set balance=balance+1000 where cId='0002'
set @sumError=@sumError+@@error

if (@sumError=0)
commit tran -- 提交成功,提交事务
else
rollback tran -- 提交失败,回滚事务


31 存储过程

就像数据库中运行方法(函数) 和C#里的方法一样,由存储过程名/存储过程参数组成/可以有返回结果。 if else/while/变量/insert/select 等,都可以在存储过程中使用。

执行速度更快 - 在数据库中保存的存储过程语句都是编译过的允许模块化程序设计 - 类似方法的复用提高系统安全性 - 防止SQL注入减少网络流通量 - 只要传输 存储过程的名称

系统存储过程:由系统定义,存放在master数据库中 -- 名称以"sp"开头或"xp"开头

系统存储过程

exec sp_databases   -- 列出服务器上的所有数据库
exec sp_helpdb -- 报告有关指定数据库或所有数据库的信息
exec sp_renamedb -- 更改数据库的名称
exec sp_tables -- 返回当前环境下可查询的对象的列表
exec sp_columns -- 返回某个表列的信息
exec sp_help -- 查看某个表的所有信息
exec sp_helpconstraint -- 查看某个表的约束
exec sp_helpindex -- 查看某个表的索引
exec sp_stored_procedures -- 列出当前环境中的所有存储过程
exec sp_password -- 添加或修改登录账户的密码
exec sp_helptext -- 显示默认值,未加密的存储过程,用户定义的存储过程,触发器或视图的实际文本


-- 创建存储过程
-- 定义存储过程的语法
create proc[edure] 存储过程名称
@参数1 数据类型=默认值 output,
@参数n 数据类型=默认值 output
as
 Sql语句
参数说明:
参数可选
参数分为输入参数,输入参数
输入参数允许有默认值
EXEC 过程名 [参数]

-- 例子
if exists (select * from sys.objects where name='usp_GroupMainlist1')
drop proc usp_GroupMainlist1
go
create proc usp_GroupMainlist1
  @pageIndex int, -- 页数
  @pageSize int, -- 条数
  @pageCount int output-- 输出共多少页
as
  declare @count int -- 共多少条数据
  select @count =count(*) from [mainlist] -- 获取此表的总条数
  set @pageCount=ceiling(@count*1.0/@pageSize)

  select * from
  (select *,row_number() over(order by [date of booking] desc) as 'num' from [mainlist]) as t
  where num between(@pageSize*(@pageIndex-1)+1) and @pageSize*@pageIndex
  order by [date of booking] desc
 
-- 调用  
declare @page int
exec usp_GroupMainlist1 1,100,@page output
select @page


32 常用函数

-- 如果 expression不为null返回 expression表达式的值,否则返回value的值
Isnull(expression,value)

-- 聚合函数
avg()  -- 平均值 统计时注意null不会被统计,需要加上isnull(列名,0)
sum() -- 求和
count() -- 求行数
min() -- 求最小值
max() -- 求最大值

-- 字符串操作函数
LEN() -- 计算字符串长度
LOWER() -- 转小写
UPPER () -- 大写
LTRIM() -- 字符串左侧的空格去掉
RTRIM () -- 字符串右侧的空格去掉
LTRIM(RTRIM('         bb       '))
 LEFT()、RIGHT() -- 截取取字符串
SUBSTRING(string,start_position,length)
-- 参数string为主字符串,start_position为子字符串在主字符串中的起始位置(从1开始),length为子字符串的最大长度。

 SELECT SUBSTRING('abcdef111',2,3)
 REPLACE(string,oldstr,newstr)

 Convert(decimal(18,2),num)-- 保留两位小数
 
-- 日期相关函数
GETDATE() --取得当前日期时间
DATEADD (datepart , number, date )-- 计算增加以后的日期。参数date为待计算的日期;参数number为增量;参数datepart为计量单位,可选值见备注。DATEADD(DAY, 3,date)为计算日期date的3天后的日期,而DATEADD(MONTH ,-8,date)为计算日期date的8个月之前的日期
DATEDIFF ( datepart , startdate , enddate ) -- 计算两个日期之间的差额。 datepart 为计量单位,可取值参考DateAdd。

-- 获取日期的某一部分 :
DATEPART (datepart,date)-- 返回一个日期的特定部分 整数
DATENAME(datepart,date)-- 返回日期中指定部分 字符串
 YEAR()
MONTH()
DAY()

-- sql语句执行顺序
 1>…From 表
 2>…Where 条件
 3>…Group by
 4>…Having 筛选条件
 5>…Select 5-1>选择列,5-2>distinct,5-3>top
 6>…Order by

-- 分组查询group by ...having
-- 对group by分组后的数据进行过滤在分组查询中,查询的列名必须出现在group by后或者在聚合函数中
-- 查询平均工资大于两千块钱的部门
 select department_id,avg(wages)
   from employee
    where department_id  is not null
      group by department_id
         having avg(wages)>2000


33 临时表

临时表 可以创建本地和全局临时表。

本地临时表仅在当前会话中可见;

全局临时表在所有会话中都可见。


本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name)。

 -- 方法一:
 create table #临时表名(字段1 约束条件,
                    字段2 约束条件,
                .....)
 create table ##临时表名(字段1 约束条件,
                        字段2 约束条件,
                    .....)
 -- 方法二:
 select * into #临时表名 from 你的表;
 select * into ##临时表名 from 你的表;

-- 注:以上的#代表局部临时表,##代表全局临时表

 drop table #Tmp   --删除临时表#Tmp
 create table #Tmp --创建临时表#Tmp
 (
    ID   int IDENTITY (1,1)     not null, --创建列ID,并且每次新增一条记录就会加1
    WokNo                varchar(50),  
     primary key (ID)      --定义ID为临时表#Tmp的主键      
 );
 Select * from #Tmp   --查询临时表的数据
 truncate table #Tmp --清空临时表的所有数据和约束

 -- 相关例子:
 Declare @Wokno Varchar(500) --用来记录职工号
 Declare @Str NVarchar(4000) --用来存放查询语句
 Declare @Count int --求出总记录数    
 Declare @i int
 Set @i = 0
 Select @Count = Count(Distinct(Wokno)) from #Tmp
 While @i < @Count
     Begin
        Set @Str = 'Select top 1 @Wokno = WokNo from #Tmp Where id not in (Select top ' + Str(@i) + 'id from #Tmp)'
        Exec Sp_ExecuteSql @Str,N'@WokNo Varchar(500) OutPut',@WokNo Output
        Select @WokNo,@i --一行一行把职工号显示出来
        Set @i = @i + 1
     End


34 表值函数

-- 创建
Create FUNCTION [dbo].[GetUPR]
(
   @upr varchar(2)  --传入函数中的参数
)
RETURNS @tab TABLE
(
UPR varchar(2) --返回表的字段,这里只有一个字段
)
AS
BEGIN
   if(@upr='0')
   begin
     insert @tab
        select 'U'
        union select 'P'
        union select 'R'
   end
   else
    begin
      insert @tab
        select @upr
    end
   RETURN ;
END

-- 调用:
select * from GetUPR ('0')


35 标量值函数

-- 创建
Create FUNCTION [dbo].[GetSalManAEmailByOrderNo]
(
   @orderNo varchar(16)
)
returns varchar(128)
AS
BEGIN
 declare @salManAEmail varchar(128)
      select @salManAEmail=name from stuInfo where stuSeat =@orderNo
   RETURN ( @salManAEmail)
ENd

-- 调用
select dbo.GetSalManAEmailByOrderNo('107')


36 触发器

作用:校验约束

-- 语法
CREATE TRIGGER trigger_name
ON {table_name | view_name}
{FOR | After | Instead of } [ insert, update,delete ]
AS          
  sql_statement

inserted与deleted对比

触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。

这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。

当触发器完成工作后,这两张表就会被删除。

Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。

-- 例子
-- 触发器新增
IF OBJECT_ID (N'TRIGER_Students_Insert', N'tr') IS NOT NULL
   DROP TRIGGER TRIGER_Students_Insert;
GO

CREATE TRIGGER TRIGER_Students_Insert
ON stuInfo
FOR INSERT
AS
   declare @stuNo int
   select @stuNo=stuInfo.stuNo FROM stuInfo
   INNER JOIN inserted ON stuInfo.stuSeat =inserted.stuSeat    
   PRINT @stuNo
   if(@stuNo<18)
   begin
      raiserror('学生年龄必须要大于18哦',16,8)
       rollback tran
   end
select * from stuInfo

insert into stuInfo values('CK3',15,'12365868','','1')


-- 更新触发器 更新stuInfo表数据 将对应User表的创建时间+1天
IF OBJECT_ID (N'TRIGER_Majors_Update', N'tr') IS NOT NULL
   DROP TRIGGER TRIGER_Majors_Update;
GO
CREATE TRIGGER TRIGER_Majors_Update
ON stuInfo
FOR UPDATE
AS

   UPDATE [User] Set [User].LoginTime=DATEADD(DAY,1,[User].LoginTime)
   FROM [User],deleted,inserted
   WHERE [User].Id = deleted.stuSex
   
   
select * from stuInfo
select * from [User]

update stuInfo set stuID='1234' WHERE stuSeat ='107'


-- 删除触发器 删除stuInfo表数据,并查看User表数据
IF OBJECT_ID (N'TRIGER_Courses_Delete', N'tr') IS NOT NULL
   DROP TRIGGER TRIGER_Courses_Delete;
GO
CREATE TRIGGER TRIGER_Courses_Delete
ON stuInfo
FOR DELETE
AS
   select * from  [User],deleted    
   WHERE [User].id = deleted.stuSex
   
select * from stuInfo
select * from [User]

delete from stuInfo  where stuSeat='113'

-- Instead Of 触发器
-- 用Instead Of触发器实现与实例3相同的功能

-- Instead Of触发器:删除课程时,同时删除该课程的选课信息
IF OBJECT_ID (N'TRIGER_Courses_Instead_Delete', N'tr') IS NOT NULL
   DROP TRIGGER TRIGER_Courses_Instead_Delete;
GO
CREATE TRIGGER TRIGER_Courses_Instead_Delete
ON stuInfo
Instead Of DELETE
AS
   declare @stuSeat int
   --获取要删除的stuInfo ID
   SELECT @stuSeat=stuSeat FROM deleted
   --删除stuInfo数据
   DELETE FROM stuInfo WHERE stuSeat=@stuSeat
   --查询对应User表
    select * from  [User] WHERE [User].id = @stuSeat
   
select * from stuInfo
select * from [User]

DELETE FROM stuInfo WHERE stuSeat='107'


37 查看触发器

select * from sysobjects where xtype='TR' and parent_obj=OBJECT_ID('monitorData')


38 查看表结构

sp_mshelpcolumns 表名称


39 Union合并查询

Union查询可以把多张表的数据合并起来.

Union只会把唯一的数据查询出来,而Union ALL则会把重复的数据也查询出来。


Select column1,Colum2 from Table1
Union
Select Column1,Column2 from Table2

Select column1,Colum2 from Table1
Union All
Select Column1,Column2 from Table2


40 函数Function

自定义SQL函数

-- 语法
Create Function functionName
As
Begin
END

-- 给定的日期中得到当前月的最后一天
Create FUNCTION [dbo].[ufn_LastDayOfMonth]
(
  @DATE NVARCHAR(10)
)
RETURNS NVARCHAR(10)
AS
BEGIN
  RETURN CONVERT(NVARCHAR(10), DATEADD(D, -1, DATEADD(M, 1, CAST(SUBSTRING(@DATE,1,7) + '-01' AS DATETIME))), 120)
END

SELECT dbo.ufn_LastDayOfMonth('2014-09-01')AS LastDay


41 Sql Server身份验证

创建新的登录账户

use master
go
exec sp_addlogin 'ck','sa123' --ck是账户,sa123是密码


删除登录账户

登录账户删除后,该账户创建的数据库用户还在,并不会一同删除

use master
go
-- 删除登录账户
exec sp_droplogin 'ck'


添加/删除数据库用户

-- 创建数据库用户
use TestManageDB
go
exec sp_grantdbaccess 'ck','ck01'

-- 删除数据库用户
use TestManageDb
go
exec sp_dropuser 'ck01'

给数据库用户授权 (grant 权限 on 表名 to 数据库用户)

注意:这里是将数据库中的数据表的权限给数据库用户

use SchoolDB
go
-- 为数据库用户分配权限(查询,修改,输入)
grant select,update,insert on UserInfo to 账户名称
-- 分配权限(创建数据表)
grant create table to 账户名称

收回数据库用户的权限(revoke 权限 on 表面 to 数据库用户)

revoke select,update,insert on 数据库 to 账户名称

给单个数据库用户授权非常麻烦,可以定义一个角色,给该角色授权,再将角色赋给特定用户。

赋予/删除数据库用户角色

-- 赋予数据库用户固定角色
exec sp_addrolemember '数据库角色名称','数据库用户名'
-- 删除角色成员
exec sp_droprolemember '数据库角色名称','数据库用户名'


42 数据类型转换convert/cast

convert(要转换的数据类型,表达式,样式)//样式可以省略,一般用于日期转字符,浮点转字符,不同样式使数据显示格式不同

convert(nvarchar(20),@id)

cast(表达式 as 数据类型) case无法指定转换的样式

-- 这里convert转换设置了样式102,使得数据样式不同与默认的了 
convert(nvarchar(100),getdate(),102) -- 2022.11.11
cast(getdate() as nvarchar(100)) -- 11 11 2022 11:11AM


文章转载自婺青年,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论