星期五, 2月 28, 2014

[SQL] 使用者自訂函數

整理使用者自訂函數的應用方式
  • 純量值函數(Scalar Function)
  • 資料表值函數(Table-Valued Function)
    • 內嵌資料表值函數(Inline Table-Valued Function)
    • 多種陳述式資料表值函數(MultiStatement Table-Valued Function)

星期二, 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

[Win] 印表機設定匯出匯入

利用 Win Vista  開始有的工具:PrintBrm 來進行印表機設定移轉,要從 Win7 32 bit 移轉至 Win7 32bit 上

首先利用系統管理員開啟命令提示字元

[Win] 印表機設定匯出匯入-2

星期五, 2月 21, 2014

[SQL] 可更新的 View

View 是虛擬的 Table,除了可以用來查詢,簡化 T-SQL 語法外,還可以透過 View 對 Tabel 進行 DML 操作

MSDN 可更新 View 條件說明
  1. 包括 UPDATE、INSERT 和 DELETE 陳述式在內的任何修改都只能參考一份基底資料表的資料行。
  2. 檢視所修改的資料行必須直接參考資料表資料行中的基礎資料。 您無法利用任何其他方法來衍生這些資料行,例如:
    • 彙總函式:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 和 VARP。
    • 計算。 您不能從使用其他資料行的運算式計算資料行。 利用設定運算子 UNION、UNION ALL、CROSSJOIN、EXCEPT 和 INTERSECT 形成的資料行會得出一項計算,這些資料行無法更新。
  3. GROUP BY、HAVING 或 DISTINCT 子句不會影響所修改的資料行。
  4. 檢視的 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 次,也就是剛好塞滿
DECLARE @Data AS char(40) = '1234567890123456789012345678901234567890'

SELECT 
    CAST(@Data AS varchar) AS 'CAST',
    CONVERT(varchar,@Data) AS 'CONVERT'
從結果就可以發現,不定義 varchar 大小情況下,只顯示 3 組資料,建議以後明確地指定大小,免的出現 bug 時,會不知道是哪裡出錯

星期五, 2月 07, 2014

[SQL] 索引使用統計資訊

建立 Index 來提高效能後,也要定期觀察該 Index 被使用的情況,可以利用 sys.dm_db_index_usage_stats DMV 來查詢 Index 使用統計資訊

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 重點欄位
  1. user_seeks:由使用者查詢所進行的搜尋數
  2. user_scans:由使用者查詢所進行的掃描數
  3. user_lookups:由使用者查詢所進行的書籤查閱數
  4. user_updates:由使用者查詢所進行的更新數
上述四個欄位觀察重點:
  1. user_seeks 為 0:該索引完全沒有作用,移除
  2. user_seeks 數字越大,user_scans 數字越小:該索引有充分被使用到
  3. user_seeks 數字越小,user_scans 數字越大:考慮移除
  4. user_seeks 遠小於 user_updates:持續更新索引,但卻沒甚麼使用到,考慮移除
  5. user_lookups 數字越大:確認是否需要把該索引改為包含索引
會利用此方式來觀察,索引存在是否合理