SqlServer 存储过程和函数语法(部分与 oracle 的区别)

判断语句

赋值

  IF(@v_count <> 0) 
  BEGIN
    SELECT @v_team_id=team_id FROM TABLE T WHERE T.column=1;
  END
    ELSE
    BEGIN
    SET@v_team_name='无';
  END

多行转一行

https://www.cnblogs.com/CreateMyself/p/9058380.html

SELECT STUFF((SELECT '/' + T.column FROM Table T FOR XML PATH('')), 1, 1, '');

oracle:listagg

CASE WHEN ELSE END

SELECT CASE column WHEN 'a' THEN 'b' ELSE 'c' END from Table

oracle

select decode(column,'a','b','c') WORK_CERT_TYPE_name from Table

判断某个值是否为null,否则替换

ISNULL(oldTeamID, 0)

oracle

nvl(oldTeamID,0)

执行存储过程,getdate() 直接做参数会报错

 SET @startDate = GETDATE();
 execute hr.Insert @pUserId, -1, @startDate, null

update 表别名

UPDATE T SET T.TID=1,T.TNAME='Name',T.TClass=1 FROM [TABLE] T WHERE T.ID=10

oracle

UPDATE TABLE T SET T.TID=1,T.TNAME='Name',T.TClass=1 WHERE T.ID=10

创建序列

https://docs.microsoft.com/zh-cn/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-2017

CREATE SEQUENCE event_seq
MINVALUE 1
MAXVALUE 999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 20;
 --使用时
GO
SELECT next value for event_seq

如果设置列默认值为序列的话填入 next value for event_seq

查看数据库最近执行的语句

https://www.cnblogs.com/chenjianxiang/p/7833588.html

SELECT TOP 1000 
       ST.text AS '执行的SQL语句',
       QS.execution_count AS '执行次数',
       QS.total_elapsed_time AS '耗时',
       QS.total_logical_reads AS '逻辑读取次数',
       QS.total_logical_writes AS '逻辑写入次数',
       QS.total_physical_reads AS '物理读取次数',       
       QS.creation_time AS '执行时间' ,  
       QS.*
FROM sys.dm_exec_query_stats QS
       CROSS APPLY 
sys.dm_exec_sql_text(QS.sql_handle) ST
WHERE QS.creation_time BETWEEN '2019-07-24 00:00:00' AND '2019-07-25 11:00:00' 
ORDER BY QS.creation_time desc;

连接符

+

oracle

||

数字 转 字符串 表达式 和去除左右空格

SELECT convert(varchar(10),1234)
SELECT CAST(12 AS varchar(10))
SELECT LTRIM(RTRIM(CAST(user_id AS varchar(20)))) 

oracle

SELECT to_char(1) FROM dual
trim(to_char(user_id)) 

分割字符串为表格

ALTER FUNCTION dbo.splitl (
	@String VARCHAR(MAX),
	@Delimiter VARCHAR(MAX)
) RETURNS @temptable TABLE (items VARCHAR(MAX)) AS
BEGIN
	DECLARE @idx INT=1
	DECLARE @slice VARCHAR(MAX) 
	IF LEN(@String) < 1 OR LEN(ISNULL(@String,'')) = 0
		RETURN
	WHILE @idx != 0
	BEGIN
		SET @idx = CHARINDEX(@Delimiter,@String)
		IF @idx != 0
			SET @slice = LEFT(@String,@idx - 1)
		ELSE
			SET @slice = @String
		IF LEN(@slice) > 0
			INSERT INTO @temptable(items) VALUES(@slice)
		SET @String = RIGHT (@String, LEN(@String) - @idx)
		IF LEN(@String) = 0
			BREAK
	END
	RETURN
END
SELECT * FROM dbo.splitl('a#b#c#d','#')

来源: https://my.oschina.net/cwalet/blog/267386

oracle

 SELECT split(a,b,c#,d, ',') FROM TABLE WHERE column = 1

创建临时表

创建临时表
       方法一:
     create table #临时表名(字段1 约束条件,
                      字段2 约束条件,
                  .....)
        方法二:
     select * into #临时表名 from 你的表;
     select * into ##临时表名 from 你的表;
注:以上的#代表局部临时表,##代表全局临时表

函数返回 table

ALTER FUNCTION [dbo].[returnTable]
( 
)
RETURNS @Tables TABLE(one int,two VARCHAR(20),three date ,four date)
AS
BEGIN
     INSERT @Tables SELECT * FROM student
     RETURN 
END

SET NOCOUNT

SET NOCOUNT ON

每次我们在使用查询分析器调试SQL语句的时候,通常会看到一些信息,提醒我们当前有多少个行受到了影响,这是些什么信息?在我们调用的时候这些信息有用吗?是否可以关闭呢? 

答案是这些信息在我们的客户端的应用程序中是没有用的,这些信息是存储过程中的每个语句的DONE_IN_PROC 信息。 

我们可以利用SET NOCOUNT 来控制这些信息,以达到提高程序性能的目的。 

查询表结构信息

https://blog.csdn.net/wangxw1803/article/details/90749909

SELECT (case when a.colorder=1 then d.name else null end) 表名, 
a.colorder 字段序号,a.name 字段名,
(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) 主键,b.name 类型,a.length 占用字节数, 
COLUMNPROPERTY(a.id,a.name,'PRECISION') as 长度, 
isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as 小数位数,(case when a.isnullable=1 then '√'else '' end) 允许空, 
isnull(e.text,'') 默认值,isnull(g.[value], ' ') AS [说明]
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
left join sys.extended_properties f on d.id=f.class and f.minor_id=0
where b.name is not null
--WHERE d.name='要查询的表' --如果只查询指定表,加上此条件
order by a.id,a.colorder

查询数据库中的所有数据库名

SELECT Name FROM Master..SysDatabases ORDER BY Name

查询所有用户数据库的表名

SELECT Name FROM SysObjects Where XType='U' ORDER BY Name
posted @ 2019-07-26 13:37  沉默的大多數  阅读(1400)  评论(0编辑  收藏  举报