SQLServer常用语句

2018.5.29 SQLServer

1.

-- 给值加1位前缀0
update CM_Secondment set fPersonID='0'+fPersonID;
-- 给值去掉第1位
update CM_Secondment set fPersonID=SUBSTRING(fPersonID,2,LEN(fPersonID));


2.Sql的with as 的使用

with as语法
–针对一个别名
with tmp as (select * from tb_name)

–针对多个别名
with
   tmp as (select * from tb_name),
   tmp2 as (select * from tb_name2),
   tmp3 as (select * from tb_name3),

--相当于建了个e临时表  
with e as (select * from scott.emp e where e.empno=7499)  
select * from e;  
   
--相当于建了e、d临时表  
with  
     e as (select * from scott.emp),  
     d as (select * from scott.dept)  
select * from e, d where e.deptno = d.deptno;  


with  
    sql1 as (select to_char(a) s_name from test_tempa),  
    sql2 as (select to_char(b) s_name from test_tempb where not exists (select s_name from sql1 where rownum=1))  
select * from sql1  
union all  
select * from sql2  
union all  
select 'no records' from dual  
       where not exists (select s_name from sql1 where rownum=1)  
       and not exists (select s_name from sql2 where rownum=1); 

3.重新创建主键

create table abcd
(
  a char(10) not null,
  b char(10) not null primary key(a,b),
  c char(10) null,
  d char(10) null
)

 

一个存在的表 abcd ,主键为 a+b ,  现在想把 a+b+c 三列修改为主键

 

 1.   删除主键:

Declare @Pk varChar(100);

Select @Pk=Name from sysobjects where Parent_Obj=OBJECT_ID('abcd') and xtype='PK';

if @Pk is not null

begin

     exec('Alter table abcd Drop '+ @Pk)  --删除原主键

 end

 

2. 把所有主键设为不能为空

alter table abcd alter column c char(10) not null

  

3.  重建主键:

ALTER Table abcd ADD CONSTRAINT pk_abcd   PRIMARY KEY (a, b, c )

4.查询占位符

select * from 表名
where 联系电话 like '[1-3]%' --------查电话是1-3开头的人
--------like是像这些条件的语句,能用通配符:%、_、[]、[^]
--------意思分别代表:所有字符、一个字符、一位上可取值、一位上不可取值

select * from 表名
where 姓名 like '[e[]%'
or 姓名 like '%e]'
escape 'e' ------------显示以‘[’开头或以‘]’结尾的所有数据,中间有不显示
----------escape ''是指定通配符

5.连接表更新

For Oracle:
update ipop_worktype_loader wl set wl.status=0
where  exists (select 1 from ipop_worktype_lkp w where  wl.worktype_id = w.worktype_id and w.application_Id=10 and wl.status=1)
 
For MS SQL Server:
update  wl  set wl.status=0  from ipop_worktype_lkp w,ipop_worktype_loader wl
where wl.worktype_id = w.worktype_id and w.application_Id=10 and wl.status=1

6.sqlserver数据库中随机生成N位的随机数

select RIGHT(100000000 + CONVERT(bigint, ABS(CHECKSUM(NEWID()))), N);

7.sql 触发器 if条件判断

if integral>50 and integral<200
begin
update customer
set lev=1
end

else 
begin

end

8.SQLServer数据集合的交、并、差集运算

并集:select * from t1 union select * from t2

不过滤重复:select * from t1 union all   select * from t2

t1对t2的差集:select * from t1 except select * from t2 

t1对t2的交集:select * from t1 intersect select * from t2

8.创建触发器时,从更新的表中查询出数据值

create trigger [tig_update] on 表名
after update  
as 
declare @id int
begin
	if (update(主表列名))
		begin
			select @id=id from inserted
			update 子表名 set lasttime = GETDATE() where pid = @id
		end
end

9.在SQL中获取一个长字符串中某个字符串出现次数的实现方法

declare @a varchar(100)
set @a='X-BGS-2010-09-15-001'
select len(replace(@a,'-','--'))-len(@a)

10.sql server 实现lastIndexOf

len(@WapImage)+1-charindex('.',reverse(@WapImage)) 

11.判断某个字符串是否包含另一个字符串

一般有两个方法:

1.用like——select * from tablename where field1 like like ‘%key%’

这种方法可以查一个句子里面包含什么词儿啥的。

2.用charindex()——charindex(字符,字符串)>0 –>包含

12.使用sqlcmd 命令执行sql 脚本

sqlcmd -S"127.0.0.1" -U"sa" -P"abcd1234!"  -i"fincc.sql" 

13.获取部门字符串

declare @s varchar(500)
declare @n varchar(500)
set @s='/ORG01.ogn/BzAVRGMxhhxBzsIw2DQ.dpt/sU4kgIg3aCkmHQcpqcX.pos/MltPzzQvty9s6J6XS0I@sU4kgIg3aCkmHQcpqcX.psm'
set @n=reverse(substring(reverse(@s), charindex('tpd.',reverse(@s)), LEN(@s)-charindex('tpd.',reverse(@s))))
select REVERSE(substring(REVERSE(@n), 5, charindex('/',REVERSE(@n))-5))

14.delete where exists使用

DELETE FROM suppliers
WHERE EXISTS
  ( select customers.name
     from customers
     where customers.customer_id = suppliers.supplier_id
     and customers.customer_name = 'IBM' );

这将在供应商表,其中有一个客户表的名称是IBM,CUSTOMER_ID是相同的supplier_id记录中删除所有记录。

15.查看sqlserver数据库当前死锁

–死锁检测 use master Select * from sysprocesses where blocked<>0 –找到SPID
exec sp_lock –根据SPID找到OBJID select object_name(85575343) –根据OBJID找到表名


16.查询字段中包含字母的结果

select PATINDEX(‘%[A-Za-z]%’, ‘ads23432’)>0


17.with语句使用

with aliasName as (select * from tableName)

如果有多个,则用逗号分隔,如

with alias1 as (select * from tableName1), alias2 as (select * from tableName2)


18.SQL 中如何去掉decimal字段後面的0

先转为float再转为varchar

CONVERT(varchar(10), cast(a.qty as float))


19.Sql server存储过程中常见游标循环用法

DECLARE @A1 VARCHAR(10), @A2 VARCHAR(10), @A3 INT DECLARE YOUCURNAME CURSOR FOR SELECT A1,A2,A3 FROM YOUTABLENAME OPEN YOUCURNAME fetch next from youcurname into @a1,@a2,@a3 while @@fetch_status<>-1 begin –您要执行的操作写在这里 fetch next from youcurname into @a1,@a2,@a3 end close youcurname deallocate youcurname


20.sqlserver 行转列

SELECT [UserName], SUM(CASE [Subject] WHEN ‘数学’ THEN [Source] ELSE 0 END) AS ‘[数学]’, SUM(CASE [Subject] WHEN ‘英语’ THEN [Source] ELSE 0 END) AS ‘[英语]’, SUM(CASE [Subject] WHEN ‘语文’ THEN [Source] ELSE 0 END) AS ‘[语文]’
FROM [TestRows2Columns] GROUP BY [UserName]


21.使用临时表实现字符串合并处理的示例

–3.3.3 使用临时表实现字符串合并处理的示例 –处理的数据 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT ‘a’,1 UNION ALL SELECT ‘a’,2 UNION ALL SELECT ‘b’,1 UNION ALL SELECT ‘b’,2 UNION ALL SELECT ‘b’,3

–合并处理 SELECT col1,col2=CAST(col2 as varchar(100)) INTO #t FROM tb ORDER BY col1,col2 DECLARE @col1 varchar(10),@col2 varchar(100) UPDATE #t SET @col2=CASE WHEN @col1=col1 THEN @col2+’,’+col2 ELSE col2 END, @col1=col1, col2=@col2 SELECT * FROM #t /–更新处理后的临时表 col1 col2 ———- ————- a 1 a 1,2 b 1 b 1,2 b 1,2,3 –/ –得到最终结果 SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1 /–结果 col1 col2 ———- ———– a 1,2 b 1,2,3 –/ –删除测试 DROP TABLE tb,#t GO


22.字符串转日期时间

convert(datetime,’2017-12-12 00:00:01’, 20)


23.SQL Server中取得某个月的天数

declare @dt datetime set @dt=getdate() select 32-Day(@dt+(32-Day(@dt)))


24.SQL Server中 求两个指定日期的相差天数

– 求两个指定日期的相差天数,不考虑时、分、秒

declare @StartDateTime datetime

declare @EndDateTime datetime

declare @iDays int

select @StartDateTime = ‘2009-04-06’

select @EndDateTime = ‘2009-04-10 09:23:23’

select @iDays = datediff(day,convert(varchar(100),@StartDateTime,23),convert(varchar(100),@EndDateTime,23))

print @iDays


25.SQL server 除法运算

select 500 / (501) *100

结果为0,由于数值是INT类型,怎么才能得到小数点呢?

select 500 / (501 + 0.0) *100

99.800300 这样就有小数点了


26.sql表中如何获得最大时间的记录

SELECT top 1 * FROM table WHERE MaxTime= (select MAX(MaxTime) from table)


27.sqlserver以逗号分割的字符串拆分到临时表

alter FUNCTION [dbo].func_split      returns @temp table([row] [int] IDENTITY(1,1) NOT NULL,valuess nvarchar(4000))      as     begin      declare @i int      set  @str=rtrim(ltrim(@str))       set  @i=charindex(@separtor,@str)       while   @i>=1        begin        insert   @temp   values(left(@str,@i-1))         set  @str=substring(@str,@i+1,len(@str)-@i)         set  @i=charindex(@separtor,@str)        end       if @str<>’’         insert @temp values(@str)        return     end

select * from  dbo.func_split(‘1,2,3,4,5,7’, ‘,’)


28.SqlServer实现mysql中GROUP_CONCAT函数

– 新建测试表 CREATE TABLE temp(id int, value varchar(10));

– 插入测试数据 INSERT INTO temp VALUES(1, ‘aa’); INSERT INTO temp VALUES(1, ‘bb’); INSERT INTO temp VALUES(2, ‘cc’); INSERT INTO temp VALUES(2, ‘dd’); INSERT INTO temp VALUES(2, ‘ff’);

– 查询,实现相同id的name以,分隔拼成字符串,id和value都为字段名称 SELECT id, [value] = stuff(( SELECT ‘,’ + [value] FROM temp t WHERE t.id = temp.id FOR xml path(‘’)) , 1 , 1 , ‘’) FROM temp GROUP BY id;


29.数据字典SQL

DECLARE @TableName varchar(20) SET @TableName=’MM_BNHead’ SELECT –(CASE when a.colorder=1 then d.name else ‘’ end) AS 表名, a.colorder 字段序号, a.name 字段名, isnull(g.[value],’’) AS 字段说明,
b.name 类型, ‘’ as 创建人, –COLUMNPROPERTY(a.id,a.name,’PRECISION’) as 长度,
case when b.name=’decimal’ then CONVERT(varchar(10),COLUMNPROPERTY(a.id,a.name,’PRECISION’)) + ‘,’ + CONVERT(varchar(10),isnull(COLUMNPROPERTY(a.id,a.name,’Scale’),0)) else CONVERT(varchar(10),COLUMNPROPERTY(a.id,a.name,’PRECISION’)) + ‘’ end as 长度, –isnull(COLUMNPROPERTY(a.id,a.name,’Scale’),0) as 小数位数, (case when a.isnullable=1 then ‘’ else ‘Y’ end) 是否必填 /, (case when COLUMNPROPERTY( a.id,a.name,’IsIdentity’)=1 then ‘√’else ‘’ end) 标识, (case when (SELECT count() FROM sysobjects WHERE (name in (SELECT name FROM sysindexes WHERE (id = a.id) AND (indid in (SELECT indid FROM sysindexkeys WHERE (id = a.id) AND (colid in (SELECT colid FROM syscolumns WHERE (id = a.id) AND (name = a.name))))))) AND (xtype = ‘PK’))>0 then ‘√’ else ‘’ end) 主键,

   a.length 占用字节数,         
   isnull(e.text,'') 默认值       
	*/ FROM syscolumns  a
LEFT JOIN systypes b on  a.xtype=b.xusertype
inner join sysobjects d on a.id=d.id  and  d.xtype='U' and  d.name<>'dtproperties'
left join syscomments e on a.cdefault=e.id
left join sys.extended_properties g on a.id=g.major_id AND a.colid = g.minor_id WHERE d.name=@TableName    --如果只查询指定表,加上此条件 order by a.id,a.colorder ```

更新列表:

*

参考文章:

相关阅读