- 純量值函數(Scalar Function)
- 資料表值函數(Table-Valued Function)
- 內嵌資料表值函數(Inline Table-Valued Function)
- 多種陳述式資料表值函數(MultiStatement Table-Valued Function)
星期五, 2月 28, 2014
[SQL] 使用者自訂函數
整理使用者自訂函數的應用方式
星期二, 2月 25, 2014
[SSRS] 互動式排序
技術論壇上問題,需求是希望 Other 選項可以放在全部資料的最後,其他資料則是依據遞增來排序,下面利用 SSRS 的互動式排序來做到此需求
- DataSet T-SQL 語法
USE [AdventureWorks2012]
GO
IF OBJECT_ID('OrderByControl') IS NOT NULL
DROP TABLE OrderByControl
CREATE TABLE OrderByControl
(
Data char(5) PRIMARY KEY
)
INSERT INTO OrderByControl VALUES
('T0001'),
('J0001'),
('A0001'),
('Other'),
('G0001')
星期一, 2月 24, 2014
星期五, 2月 21, 2014
[SQL] 可更新的 View
View 是虛擬的 Table,除了可以用來查詢,簡化 T-SQL 語法外,還可以透過 View 對 Tabel 進行 DML 操作
MSDN 可更新 View 條件說明
Sample Data
MSDN 可更新 View 條件說明
- 包括 UPDATE、INSERT 和 DELETE 陳述式在內的任何修改都只能參考一份基底資料表的資料行。
- 檢視所修改的資料行必須直接參考資料表資料行中的基礎資料。 您無法利用任何其他方法來衍生這些資料行,例如:
- 彙總函式:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 和 VARP。
- 計算。 您不能從使用其他資料行的運算式計算資料行。 利用設定運算子 UNION、UNION ALL、CROSSJOIN、EXCEPT 和 INTERSECT 形成的資料行會得出一項計算,這些資料行無法更新。
- GROUP BY、HAVING 或 DISTINCT 子句不會影響所修改的資料行。
- 檢視的 select_statement 中任何位置都不會使用 TOP 與 WITH CHECK OPTION 子句。
Sample Data
USE [AdventureWorks2012]
GO
IF OBJECT_ID('Orders') IS NOT NULL
DROP TABLE Orders
IF OBJECT_ID('OrdersDetail') IS NOT NULL
DROP TABLE OrdersDetail
IF OBJECT_ID('vwDemo') IS NOT NULL
DROP VIEW vwDemo
CREATE TABLE Orders
(
OrderNO char(10) Primary Key,
OrderDate date,
Total money
)
CREATE TABLE OrdersDetail
(
ID int identity Primary Key,
OrderNO char(10),
ProdID int,
ProductName nchar(20),
UnitPrice money,
Qty int
)
INSERT INTO Orders VALUES
('1030206001','20140206',1889)
INSERT INTO OrdersDetail VALUES
('1030206001',1,N'SQL Server 2012 管理',456,1),
('1030206001',2,N'SQL Server 2012 設計',400,2),
('1030206001',3,N'SQL Server 2012 效能調校',633,1)
GO
CREATE VIEW vwDemo
AS
SELECT
O.OrderNO,
O.OrderDate,
O.Total,
OD.ProdID,
OD.ProductName,
OD.UnitPrice,
OD.Qty,
UnitPrice * Qty AS SubTotal
FROM Orders AS O
JOIN OrdersDetail AS OD ON O.OrderNO = OD.OrderNO
WHERE O.OrderDate >= '20140101'
GO
星期五, 2月 14, 2014
[SQL] CAST 和 CONVERT 中 char、varchar 預設值
聽到這樣的說法,利用 CONVERT 轉成 varchar 時,不用指定大小,只要指定 varchar 有多少資料就轉多少,但 MSDN 上說明的很清楚,利用 CAST 或 CONVERT 轉換資料為 char 或 varchar 不指定大小情況下,預設值是 30
阿呆範例來說明,故意定義一個 char 為 40 的變數,資料內容塞 1 - 0,10 個字元一組並重覆 4 次,也就是剛好塞滿
阿呆範例來說明,故意定義一個 char 為 40 的變數,資料內容塞 1 - 0,10 個字元一組並重覆 4 次,也就是剛好塞滿
DECLARE @Data AS char(40) = '1234567890123456789012345678901234567890'
SELECT
CAST(@Data AS varchar) AS 'CAST',
CONVERT(varchar,@Data) AS 'CONVERT'
從結果就可以發現,不定義 varchar 大小情況下,只顯示 3 組資料,建議以後明確地指定大小,免的出現 bug 時,會不知道是哪裡出錯- 參考資料
- char 和 varchar
星期五, 2月 07, 2014
[SQL] 索引使用統計資訊
建立 Index 來提高效能後,也要定期觀察該 Index 被使用的情況,可以利用 sys.dm_db_index_usage_stats DMV 來查詢 Index 使用統計資訊
sys.dm_db_index_usage_stats DMV 語法
sys.dm_db_index_usage_stats DMV 語法
SELECT
s.name AS SchemaName ,
t.Name AS TableName ,
ix.Name AS IndexName ,
ix.type_desc ,
us.user_seeks ,
us.user_scans ,
us.user_lookups ,
us.user_updates
FROM sys.tables AS t
JOIN sys.schemas s on t.[schema_id] = s.[schema_id]
JOIN sys.indexes AS ix ON t.[object_id] = ix.[object_id]
JOIN sys.dm_db_index_usage_stats AS us ON ix.[object_id] = us.[object_id]
AND ix.index_id = us.index_id
WHERE t.type = 'U' -- 使用者自訂 Table
sys.dm_db_index_usage_stats 重點欄位- user_seeks:由使用者查詢所進行的搜尋數
- user_scans:由使用者查詢所進行的掃描數
- user_lookups:由使用者查詢所進行的書籤查閱數
- user_updates:由使用者查詢所進行的更新數
- user_seeks 為 0:該索引完全沒有作用,移除
- user_seeks 數字越大,user_scans 數字越小:該索引有充分被使用到
- user_seeks 數字越小,user_scans 數字越大:考慮移除
- user_seeks 遠小於 user_updates:持續更新索引,但卻沒甚麼使用到,考慮移除
- user_lookups 數字越大:確認是否需要把該索引改為包含索引
- 參考資料
- 論壇問題討論
- 如何找出 SQL Server 2008 資料庫裡是否建立了多餘的索引
- 認識 sys.dm_db_index_usage_stats 目錄檢視,查詢與索引作業相關的計數器資料
- [SQL]找出DB中沒有使用或成本高的索引資訊
- How to get index usage information in SQL Server
- 網路討論 - 說明 Clustered Index 的 user_lookup 產生原因