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 { ON | OFF }

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM