---
# System prepended metadata

title: Command
tags: [SQLServer, Command, MSSQL, SQL]

---

# Command
###### tags: `MSSQL` `Command` `SQL` `SQLServer`

**1. CROSS APPLY (不含NULL) & OUTER APPLY(含NULL)**
APPLY 基本等同於JOIN 
CROSS APPLY : CROSS JOIN 差別
 CROSS JOIN 如果是子查詢表則不能使用前表的欄位帶入=> 
 SELECT * FROM A CROSS JOIN (SELECT *FROM B WHERE B.ID = A.ID) 
 這樣會語法錯誤，而CROSS APPLY可以因此基本上CROSS JOIN可以被CROSS APPLY取代

OUTER APPLY = LEFT OUTER JOIN

Advantage : 
1.可將主表的欄位 帶入function 或是 查詢條件.ex2.ex3

ex1.
	
    SELECT  TB.COL1,TB.COL2,Alias.Col1,Alias.Col2...... 
    FROM TABLE TB 
    CROSS APPLY
    ( VALUES ( [ COL1,COL2.....],[ COL3,COL4.....]) ) [Alias] 
    [COL_NAME1,COL_NAME2 ....]

ex2. 

	SELECT  TB.COL1,TB.COL2,Alias.Col1,Alias.Col2...... 
    FROM TABLE TB 
    CROSS APPLY
    ( funciton(tb.col....) ) [Alias] 

ex3.

    SELECT  TB.COL1,TB.COL2,Alias.Col1,Alias.Col2...... 
    FROM TABLE TB 
    CROSS APPLY
    (Subquery [WHERE tb.col.... ]) [Alias]


**2. PIVOT & UNPIVOT**



**3.STUFF**

STUFF 函數會將字串插入另一個字串。  它會在第一個字串的開始位置刪除指定長度的字元，然後將第二個字串插入第一個字串的開始位置。
		
		STUFF( character_expression , start , length , replaceWith_expression )

**4.FOR XML [RAW,AUTO,EXPLICIT,PATH] **
最上層的語句中只能使用在SELECT陳述句
子查詢則可以使用在UPDATE 、 INSERT 、 DELETE

RAW、AUTO 、EXPLICIT、PATH
將查詢結果產生一個 <資料列> 項目並以XML格式呈現，差別在於XML欄位外觀自訂程度

PATH可以指定欄位名為空字串搭配應用>將多筆資料合併為同一格欄位

**5.系統提供的view,可查詢Object內的關鍵字**
code-1
	
	SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE
	FROM INFORMATION_SCHEMA.ROUTINES
	WHERE ROUTINE_DEFINITION LIKE'%key_word%'
	AND ROUTINE_TYPE ='PROCEDURE';
	
code-2

	SELECT distinct sys.sysobjects.name, sys.sysobjects.type
	FROM sys.sysobjects INNER JOIN syscomments
	ON sys.sysobjects.id = sys.syscomments.id
	WHERE sys.syscomments.text LIKE '%key_word%'
	AND sys.sysobjects.type = 'P'
	ORDER BY sys.sysobjects.NAME
常用type
FN : 純量函數
P：stored procedure (預存程序)  
V：view (檢視表)
