星期五, 8月 30, 2013

[SQL] 備份至遠端儲存設備

沒有網域情況下,要從 Server A 備份資料至 Server B,要注意的重點為
  1. Server A 的 SQL Server 服務啟動帳戶在 Server B 要有同名的帳號密碼
  2. Server B 上要設定共用資料夾且必須具備該資料夾讀取權限
Step 1:設定同名帳號跟密碼
  • Server A SQL Server 服務帳戶為[SQLServer]
[SQL] 備份至遠端儲存設備-7
  • Server B 設定同名帳戶密碼
[SQL] 備份至遠端儲存設備-8

星期五, 8月 23, 2013

[SQL] COPY_ONLY

SQL Server 進行備份時會變更資料庫,且會影響往後其他備份的還原方式,但假如備份時指定 COPY_ONLY 參數,則不會影響。

COPY_ONLY 是從 SQL Server 2005 開始推出的功能,在 SQL Server 2005 無法透過 SSMS 進行 COPY_OLNY 備份,只能透過 T-SQL 進行,在 SQL Server 2008 時,才可以在 SSMS 內操作。
    此為 SQL Server 2012 截圖
[SQL] COPY_ONLY -1

星期五, 8月 16, 2013

[SQL] 次序函數應用 - identity()

identity() 可以說是 SQL SERVER 2000 的次序函數,identity() 搭配 SELECT INTO,可以對資料產生順序,但受限於 identity() 本身功能,其應用彈性較小,SQL Server 2005 開始提供的次序函數(ROW_NUMBER、RANK、DENSE_RANK 和 NTILE),提供更好的功能。
  • identity()
說明:搭配 SELECT INTO 語法,來將識別欄位插入新資料表中。
語法:IDENTITY (data_type [ , seed , increment ] ) AS column_name
  1. data_type:識別欄位資料類型
  2. seed:第一個資料列整數值,預設值為 1
  3. increment:後續資料列增加的整數值,預設值為 1
  4. column_name:欄位名稱
  • 簡易範例:列出業務人員接單數量,並根據其數量排序
-- 使用 AdventureWorks2012 
IF OBJECT_ID (N'ROWTable') IS NOT NULL
    DROP TABLE ROWTable

SELECT 
  IDENTITY(int,1,1) AS ROWNO , -- 從 1 開始,一次增加 1 來當成順序
  P.BusinessEntityID ,
  P.LastName ,
  P.FirstName ,
  T.SalesCount
  INTO ROWTable -- 產生 ROWTable
FROM [Person].[Person] AS P
  JOIN
    (
      SELECT 
        SalesPersonID , 
        COUNT(*) AS SalesCount
      FROM [Sales].[SalesOrderHeader]
      GROUP BY SalesPersonID
    ) AS T ON P.BusinessEntityID = T.SalesPersonID
ORDER BY SalesCount DESC -- 根據接單數量排序

-- 查詢產生順序結果 ROWTable
SELECT * FROM ROWTable
[SQL] 次序函數應用 - identity()

星期一, 8月 12, 2013

[SSRS] 部署報表

要把設計好的報表上傳至 Report Service 上,必須先對該專案設定 TargetServerURL 才能進行部屬。

專案 => 右鍵屬性 => 專案屬性 => TargetServerURL

[SSRS] 部署報表-1

報表 => 右鍵屬性 => 部屬

[SSRS] 部署報表-2

Report Service 登入

[SSRS] 部署報表-3

嘗試輸入登錄 Report Service 服務帳戶密碼竟然無法登錄,有檢查過 SQL Server 登錄帳戶權限,想說是不是沒有讀取 ReportServer DB 權限,發現也不是這個原因,最後發現 TargetServerURL 輸入錯誤,因為安裝時指定 instance name,TargetServerURL 必須用 http://localhost/ReportServer$SQL2005 才是正確,為什麼錯誤訊息不是顯示不存在,而是要我輸入登錄帳號和密碼啊,Orz ~~

再次部署報表就成功啦,並進入 Report Maanger 中確認

[SSRS] 部署報表-4

書本上說明的預設路徑
  • Report Service 預設路徑是 http://localhost/ReportServer ;
  • Report Manager 預設路徑是 http://localhost/Reports,
一開始也是傻傻地利用預設路徑去登錄,當然都登錄失敗,後來才發現那是預設執行個體才可以利用它登錄,指定 instance name(我設為SQL2005) 的話,就必須在後面加上 $SQL2005 才行,也就是
  • Report Service:http://localhost/ReportServer$SQL2005
  • Report Manager:http://localhost/Reports$SQL2005
每次都忘記改過 instance name 一直採到這個地雷,>.< ~~

星期一, 8月 05, 2013

[SSRS] 格式化條件 - 字型顏色、字型粗細

技術論壇上看見的問題,要對平均分數進行格式化
  1. 平均大於 90 分必須用藍色表示
  2. 平均小於 60 分必須用粗體表示。
在 AdventureWorks2012 內建立一個 Table 來 Demo 用。
USE [AdventureWorks2012]
GO

IF OBJECT_ID('Score') IS NOT NULL
      DROP TABLE Score

CREATE TABLE Score (STDNO char(3), STDName nchar(8) , AVGScore numeric(3,1))
INSERT INTO Score VALUES
      ('001' , N'張三' , 95) ,
      ('002' , N'李四' , 59) ,
      ('003' , N'王五' , 73)
平均分數欄位 => 文字方塊屬性 => 可以看見[色彩]和[粗體]兩個選項,分別點選 [fx]方塊進入設定。
[SSRS] 格式化條件-2

[色彩]中輸入 = IIF(Fields!AVGScore.Value > 90 , "Blue" , "Black")
[SSRS] 格式化條件-3

[粗體]中輸入 = IIF(Fields!AVGScore.Value < 60 , "Bold" , "Default")
[SSRS] 格式化條件-4

利用預覽來觀看格式化結果
[SSRS] 格式化條件-1

星期五, 8月 02, 2013

[SQL] HierarchyId - 字串路徑

此論壇問題是要利用 HierarchyId 來找出字串路徑,HierarchyId 可以透過 CAST(HierarchyId AS ncarchar(4000)) 直接轉成字串路徑(EX:\1\2\3),而此問題是要找出以[名稱]為主的字串路徑(EX:公司\課級\組級),在沒有現成函數可以使用的前提下,還是只能跑 CTE 來取得。
  • Sample Data
USE TempDB
GO

IF OBJECT_ID('Demo') IS NOT NULL
    DROP TABLE Demo

CREATE TABLE Demo 
(
    NO int NOT NULL PRIMARY KEY NONCLUSTERED ,
    NOName nvarchar(500) , 
    HID hierarchyid ,
    HLevel AS HID.GetLevel()
)
GO 

DECLARE @Parent AS HIERARCHYID
DECLARE @Child AS HIERARCHYID

-- 公司資料
SELECT @Parent = hierarchyid::GetRoot()
INSERT INTO Demo (NO,NOName,HID) VALUES(1,N'公司',@Parent)

-- 課級資料
SELECT @Parent = HID FROM Demo WHERE NO = 1
SELECT @Child = @parent.GetDescendant(NULL, NULL)
INSERT INTO Demo (NO,NOName,HID) VALUES(2,N'課級1',@Child)
SELECT @Child = @parent.GetDescendant(@Child, NULL)
INSERT INTO Demo (NO,NOName,HID) VALUES(3,N'課級2',@Child)

-- 組級資料
SELECT @Parent = HID FROM Demo WHERE NO = 2
SELECT @Child = @parent.GetDescendant(NULL, NULL)
INSERT INTO Demo (NO,NOName,HID) VALUES(4,'組級1',@Child)
SELECT @Child = @parent.GetDescendant(@Child, NULL)
INSERT INTO Demo (NO,NOName,HID) VALUES(5,'組級2',@Child)

SELECT @Parent = HID FROM Demo WHERE NO = 3
SELECT @Child = @parent.GetDescendant(NULL, NULL)
INSERT INTO Demo (NO,NOName,HID) VALUES(6,'組級3',@Child)
SELECT @Child = @parent.GetDescendant(@Child, NULL)
INSERT INTO Demo (NO,NOName,HID) VALUES(7,'組級4',@Child)
SELECT @Child = @parent.GetDescendant(@Child, NULL)
INSERT INTO Demo (NO,NOName,HID) VALUES(8,'組級5',@Child)