- 故意把導風散熱裝置拆下來拍照
- 整理過後導風散熱裝置原貌
- 參考資料:
- 請善待你的電腦
DECLARE @Temp table (SeqNO smallint)
INSERT INTO @Temp VALUES(1)
INSERT INTO @Temp VALUES(3)
INSERT INTO @Temp VALUES(4)
INSERT INTO @Temp VALUES(9)
;
WITH CTE
AS
(
SELECT 1 AS SeqNO
UNION ALL
SELECT SeqNO + 1
FROM CTE
WHERE SeqNO < 5
)
SELECT MIN(T1.SeqNO) AS MinNO
FROM CTE AS T1
LEFT JOIN @Temp AS T2 ON T1.SeqNO = T2.SeqNO
WHERE T2.SeqNO IS NULL
EmployeeID EmployeeName Department Salary
----------- --------------- --------------- ---------
1 T Cook Finance 40000.00
2 D Michael Finance 25000.00
3 A Smith Finance 25000.00
4 D Adams Finance 15000.00
5 M Williams IT 80000.00
6 D Jones IT 40000.00
7 J Miller IT 50000.00
8 L Lewis IT 50000.00
9 A Anderson Back-Office 25000.00
10 S Martin Back-Office 15000.00
11 J Garcia Back-Office 15000.00
12 T Clerk Back-Office 10000.00
SELECT T.EmployeeID , T.EmployeeName, T.Department, T.Salary
FROM
(
SELECT EmployeeID , EmployeeName, Department, Salary ,
RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) AS RANKNO
FROM @Employees
) AS T
WHERE RANKNO = 2
SELECT EmployeeID,EmployeeName,Department,Salary
FROM @Employees e0
WHERE
(
SELECT Count(DISTINCT e1.Salary)
FROM @Employees e1
WHERE e1.Salary >= e0.Salary
AND e1.Department = e0.Department
) = 2
ORDER BY Department, EmployeeID
EmployeeID EmployeeName Department Salary
----------- --------------- --------------- ---------
10 S Martin Back-Office 15000.00
11 J Garcia Back-Office 15000.00
2 D Michael Finance 25000.00
3 A Smith Finance 25000.00
7 J Miller IT 50000.00
8 L Lewis IT 50000.00
-- 新增欄位
ALTER TABLE TableName ADD ColName DataType
-- 刪除欄位
ALTER TABLE TableName DROP COLUMN ColName
-- 修改欄位資料型態
ALTER TABLE TableName ALTER COLUMN ColName DataType
-- 修改欄位名稱
EXEC sp_rename 'TableName.OldColName','NewColName','COLUMN'
loObject = CREATEOBJECT("AutoCAD.Application")
loObject = CREATEOBJECT("AutoCAD.AcadApplication")
-- 宣告 FindExecutable API
DECLARE INTEGER FindExecutable IN shell32 STRING lpFile, STRING lpDir, STRING @lpResult
lcResult = SPACE(250) -- 接收 FindExecutable API 的回傳值,回傳值為執行檔完整路徑
lcTestFile = ADDBS(GETENV("TEMP")) + "Dummy.DWG" -- 建立測試檔案
STRTOFILE("",(lcTestFile)) -- 在 Windows Temp 資料夾內,建立一個沒有內容的 AutoCAD DWG 檔案
IF FindExecutable ((lcTestFile), "", @lcResult) > 32 -- 大於 32 代表執行成功,有 AutoCAD 軟體
MESSAGEBOX(lcResult) -- 顯示 AutoCAD 執行檔路徑
ELSE
MESSAGEBOX("沒有安裝 AutoCAD")
ENDIF
更改測試檔案副檔名(Excel XLS 或 XLSX、Word DOC 或 DOCX),就可以判斷軟體是否安裝在電腦上。DECLARE @Data1 Table (NO char(5))
DECLARE @Data2 Table (NO char(5))
INSERT INTO @Data1 VALUES ('1')
INSERT INTO @Data1 VALUES ('2')
INSERT INTO @Data1 VALUES ('3')
INSERT INTO @Data1 VALUES ('4')
INSERT INTO @Data1 VALUES ('5')
INSERT INTO @Data2 VALUES ('1')
INSERT INTO @Data2 VALUES ('3')
INSERT INTO @Data2 VALUES ('5')
-- 方法 1 利用 JOIN
DELETE T1
FROM @Data1 AS T1 JOIN @Data2 AS T2 ON T1.NO = T2.NO
-- 方法 2 利用 IN
DELETE FROM @Data1
WHERE NO IN (SELECT NO FROM @Data2)
SET NOCOUNT ON
WHILE 1 = 1 -- 一直進入迴圈
BEGIN
DELETE TOP (1000) -- 利用 TOP 限制刪除筆數(1000為使用者自訂筆數、括號一定要存在)
FROM TableName
WHERE Condition -- 篩選條件
IF @@ROWCOUNT = 0 -- 假如沒有刪除任何資料,則跳出迴圈
BREAK
END
使用上述語法必須注意 @@ROWCOUNT 只會傳回前一個 T-SQL 影響的資料數,假如該 Table 上有設定 Delete Trigger 或 Foreign Key 的 Delete Cascade 的話,@@ROWCOUNT 的回傳值,並不是真正該 Table 的刪除資料數。Date CustomerID Type Amount
---------- ---------- ----- --------
2011-01-01 CUST1001 INV 12000.00
2011-01-02 CUST1001 PAY 3000.00
2011-01-03 CUST1001 INV 8000.00
2011-01-04 CUST1001 PAY 9000.00
2011-01-04 CUST1002 INV 1000.00
2011-01-05 CUST1002 PAY 5000.00
2011-01-05 CUST1002 INV 6000.00
Date CustomerID Type Amount Balance
---------- ---------- ----- -------- ---------
2011-01-01 CUST1001 INV 12000.00 12000.00
2011-01-02 CUST1001 PAY 3000.00 9000.00
2011-01-03 CUST1001 INV 8000.00 17000.00
2011-01-04 CUST1001 PAY 9000.00 8000.00
2011-01-04 CUST1002 INV 1000.00 1000.00
2011-01-05 CUST1002 INV 6000.00 7000.00
2011-01-05 CUST1002 PAY 5000.00 2000.00
-- 建立測試資料
DECLARE @Temp Table (class char(10),SdtName char(10),Score smallint)
INSERT INTO @Temp VALUES ('小叮噹班','大雄',10)
INSERT INTO @Temp VALUES ('小叮噹班','阿福',90)
INSERT INTO @Temp VALUES ('小叮噹班','技安',70)
INSERT INTO @Temp VALUES ('小叮噹班','宜靜',100)
INSERT INTO @Temp VALUES ('海賊王班','魯夫',20)
INSERT INTO @Temp VALUES ('海賊王班','娜美',90)
INSERT INTO @Temp VALUES ('海賊王班','騙人布',65)
INSERT INTO @Temp VALUES ('海賊王班','香吉士',30)
INSERT INTO @Temp VALUES ('海賊王班','索隆',20)
INSERT INTO @Temp VALUES ('網球王子班','不二',95)
INSERT INTO @Temp VALUES ('網球王子班','英二',75)
INSERT INTO @Temp VALUES ('網球王子班','手塚',99)
INSERT INTO @Temp VALUES ('網球王子班','越前',80)
INSERT INTO @Temp VALUES ('網球王子班','河村',20)
SELECT * ,
ROW_NUMBER() OVER (PARTITION BY class ORDER BY Score DESC) AS ROWNO
FROM @Temp
-- 建立測試資料
IF OBJECT_ID (N'Leave',N'U') IS NOT NULL
DROP TABLE Leave
CREATE TABLE Leave (Date datetime,EmpName varchar(8))
INSERT INTO Leave VALUES('2011-08-01','張三')
INSERT INTO Leave VALUES('2011-08-02','張三')
INSERT INTO Leave VALUES('2011-08-22','張三')
INSERT INTO Leave VALUES('2011-08-01','李四')
INSERT INTO Leave VALUES('2011-08-22','李四')
INSERT INTO Leave VALUES('2011-08-01','王五')
INSERT INTO Leave VALUES('2011-08-23','王五')
INSERT INTO Leave VALUES('2011-08-24','王五')
INSERT INTO Leave VALUES('2011-08-25','王五')
使用者自訂函數IF OBJECT_ID(N'dbo.getCommaString', N'FN') IS NOT NULL
DROP FUNCTION dbo.getCommaString
-- 建立 FUNCTION
CREATE FUNCTION getCommaString(@date datetime)
RETURNS varchar(500) --500若不夠,請加大
BEGIN
DECLARE @string varchar(500) --500若不夠,請加大
SET @string = ''
SELECT @string = @string + EmpName + ','
FROM Leave
WHERE Date = @date
ORDER BY EmpName
SET @string = LEFT(@string,LEN(@string)-1) -- 把最後面的逗號後刪除
RETURN @string
END
-- 使用自定函數來進行字串連結
SELECT
CONVERT(char(10),Date,120) AS [日期],
DATENAME(dw,Date) AS [星期],
dbo.getCommaString(Date) AS [請假人員]
FROM Leave
GROUP BY Date
-- 宣告一個 Table 變數來承接 CURSOR 跑完的結果
DECLARE @Temp table (Date datetime,String varchar(100))
DECLARE curTemp CURSOR
FOR
(
SELECT Date
FROM Leave
GROUP BY Date
)
OPEN curTemp
DECLARE @date as datetime
DECLARE @string as varchar(100)
FETCH NEXT FROM curTemp INTO @date
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @string = ''
SELECT @string = @string + EmpName + ','
FROM Leave
WHERE Date = @date
SET @string = LEFT(@string,LEN(@string)-1)
INSERT INTO @Temp (Date,String)
VALUES(@date,@string)
FETCH NEXT FROM curTemp INTO @date
END
CLOSE curTemp
DEALLOCATE curTemp
SELECT
CONVERT(char(10),Date,120) AS [日期],
DATENAME(dw,Date) AS [星期],
String AS [請假人員]
FROM @Temp
CTE ;
WITH CTE AS
(
SELECT
Date ,
CAST('' AS nvarchar(100)) AS Data ,
CAST('' AS nvarchar(100)) AS String ,
0 AS Counts ,
COUNT(*) AS Total -- 資料總筆數
FROM Leave
GROUP BY Date
UNION ALL
SELECT
L.Date ,
CAST(L.EmpName AS NVARCHAR(100)) ,
CAST(String + ',' + L.EmpName AS nvarchar(100)) ,
Counts + 1 ,
Total
FROM CTE AS T
JOIN Leave AS L ON T.Date = L.Date
AND T.Data < L.EmpName -- 遞迴停止重要關鍵
)
SELECT
CONVERT(char(10),Date,120) AS [日期],
DATENAME(dw,Date) AS [星期],
STUFF(String,1,1,'') AS [請假人員]
FROM CTE
WHERE Counts = Total -- 利用資料總筆來判斷哪一筆是最後一筆
ORDER BY Date
FOR XML PATH 應用SELECT
Date AS 日期,
DATENAME(dw,Date) AS 星期 ,
(
STUFF -- 說明 3
(
(
SELECT ',' + EmpName -- 說明 2
FROM LEave T2
WHERE T2.Date = T1.Date
FOR XML PATH('') -- 說明 1
)
, 1, 1, ''
)
) AS [請假人員]
FROM Leave T1
GROUP BY Date
SELECT
[Date] AS 日期,
DATENAME(dw,Date) AS 星期 ,
STRING_AGG(EmpName , ',') AS [請假人員]
FROM Leave
GROUP BY [Date]
這五種作法中,CURSOR 和 CTE 比較不會應用在實務上,個人練習用。
CREATE FUNCTION [dbo].[ISDIGIT] ( @string as nvarchar(250) ) RETURNS bit AS BEGIN DECLARE @true bit IF @string LIKE '[0-9]%' SET @true = 1 ELSE SET @true = 0 RETURN @true END
CREATE FUNCTION [dbo].[ISALPHA] ( @string as nvarchar(250) ) RETURNS bit AS BEGIN DECLARE @true bit IF @string LIKE '[A-Z]%' -- 不區分大小寫 SET @true = 1 ELSE SET @true = 0 RETURN @true END
SELECT Val, '數字判斷' = CASE WHEN dbo.ISDIGIT(Val) = 1 THEN '數字' ELSE '' END, '字母判斷' = CASE WHEN dbo.ISALPHA(Val) = 1 THEN '字母' ELSE '' END FROM ( SELECT '123' AS Val UNION ALL SELECT '456' UNION ALL SELECT 'ABC' UNION ALL SELECT 'def' -- 故意小寫 ) AS T
SELECT CAST(0 AS datetime)
SELECT CAST('' AS datetime)
-- 利用 REPLACE 把 連接號(-)、空格和冒號(:)拿掉
SELECT
REPLACE(
REPLACE(
REPLACE(CONVERT(varchar(20), GETDATE(), 120 ),'-','') -- 把連結號拿掉
,' ','') -- 把空格拿掉
,':','') -- 把冒號拿掉
-- 當年第一天
SELECT
DATEADD(yy,
DATEDIFF(yy,'',GETDATE()) -- 邏輯 1 計算值
,'')
-- 當月第一天
SELECT
DATEADD(mm,
DATEDIFF(mm,'',GETDATE()) -- 邏輯 1 計算值
,'')
-- 當季第一天
SELECT
DATEADD(qq,
DATEDIFF(qq,'',GETDATE()) -- 邏輯 1 計算值
,'')
-- 當週星期一日期
SELECT
DATEADD(wk,
DATEDIFF(wk,'',GETDATE()) -- 邏輯 1 計算值
,'')
最後一天日期計算-- 上月最後一天
SELECT
DATEADD(dd,-1, -- 減 1 天
DATEADD(mm,DATEDIFF(mm,'',GETDATE()),'') -- 當月第一天日期
)
-- 去年最後一天
SELECT
DATEADD(dd,-1, -- 減 1 天
DATEADD(yy,DATEDIFF(yy,'',GETDATE()),'') -- 當年第一天日期
)
-- 本月最後一天
SELECT
DATEADD(dd,-1, -- 減 1 天
DATEADD(mm,DATEDIFF(mm,'',GETDATE()) + 1,'') -- 計算值 加 1 個月,找出下個月第一天
)
-- 本年最後一天
SELECT
DATEADD(dd,-1, -- 減 1 天
DATEADD(yy,DATEDIFF(yy,'',GETDATE()) + 1,'') -- 計算值 加 1 年,找出明年第一天
)
-- 方法一:搭配 DATEADD、DATEDIFF 應用
SELECT
DATEADD
(dd,
DATEDIFF(dd,'',GETDATE())
,'')
-- 方法二:利用轉換資料形態
SELECT
CAST
(
CONVERT(char(10),GETDATE(),120) -- 把 GETDATE() 轉為字串,因限定字元因素,只會產生 yyyy-mm-dd
AS Datetime
) -- 再把 yyyy-mm-dd 轉為 datetime 變成午夜時間
-- 方法一:搭配 DATEADD、DATEDIFF 應用
SELECT
DATEADD(dd,-1,
DATEADD(mm,DATEDIFF(mm,'',GETDATE()) + 1,'')
)
-- 方法二:利用 2012 提供的新函數 EOMONTH
-- EOMONTH 回傳值為 date 資料型態
SELECT EOMONTH(GETDATE())
IF OBJECT_ID(N'dbo.PADL', N'FN') IS NOT NULL DROP FUNCTION dbo.PADL
CREATE FUNCTION [dbo].[PADL] ( @String nvarchar(100), -- 字串來源 @PaddingChar nvarchar(1), -- 填補字元 @StringLen tinyint -- 字串長度 ) RETURNS nvarchar(200) AS BEGIN DECLARE @Result nvarchar(200) -- 方法一 SET @Result = RIGHT(REPLICATE(@PaddingChar,@StringLen) + @String,@StringLen) -- 方法二 SET @Result = REPLICATE(@PaddingChar,@StringLen - LEN(@String)) + @String RETURN @Result END GO
ActiveSheet 現在 Excel 上擁有控制權的 Sheet、
Sheets(Var) 和
WorkSheets(Var) 為指定 Sheet 的兩種方式,Var 可以為 Sheet 名稱或是索引值。
-- 以下語法大多利用 ActiveSheet 來指定 Sheet,當然也可以利用 Sheet(Var)來達到相同效果
loExcel = CREATEOBJECT("Excel.Application")
-- 建立 Excel 物件
loExcel.SheetsInNewWorkBook = liSheetQty
-- 指定 Excel Sheet 數目
loExcel.WorkBooks.Add
-- 根據 SheetsInNewWorkBook 的設定值,把 Sheet 加入 Excel 內
lnSheetQty = loExcel.Sheets.Count
-- 查詢 Excel 內有多少個 Sheet
loExcel.Sheets(Var).NAME = SheetName
-- Sheet 名稱更名
loExcel.ActiveSheet.Delete()
loExcel.Sheets(Var).Delete()
-- 刪除 Sheet
loExcel.Visible = .T.
-- 顯示 Excel 物件,預設為不顯示
loExcel.WorkSheets(Var).Activate -- 書上列的
loExcel.Sheets(Var).Activate -- 自己常用
-- 指定 Excel Sheet
loExcel.WorkBooks.OPEN((lcExcelPath))
-- 打開 Excel 檔案 ; lcExcelPath 必須包含副檔(XLS、XLSX)
loExcel.ActiveSheet.Cells(lnRows,lnColumns) = Values
loExcel.Sheets(Var).Cells(lnRows,lnColumns) = Values
loExcel.Cells(lnRows,lnColumns).Value = Values
-- 設定儲存格的資料,EX:Cells(3,5)代表第三行、第五列(欄)
-- 前兩種方式沒有 Value 屬姓
loExcel.ActiveSheet.Rows(lnRows).FONT.SIZE = lnFontSize
loExcel.ActiveSheet.Columns(lnColumns).FONT.SIZE = lnFontSize
-- 設定第 lnRows 行和第 lnColumns 列的字形大小
loExcel.ActiveSheet.Rows(lnRows).RowHeight = lnHeight
loExcel.ActiveSheet.Columns(lnColumns).ColumnWidth = lnWidth
-- 設定第 lnRow 行的高度;設定第 lnColumns 的寬度
loExcel.ActiveSheet.Range(lcRange).Select
-- 選定區域;lcRange 為儲存格範圍,EX:A1:D10
loExcel.SELECTION.Locked = .F.
-- 解除選取範圍內的鎖定
loExcel.ActiveSheet.Protect(Password)
-- 保護現有Sheet,Password 為保護密碼
loExcel.ActiveSheet.unProtect(Password)
-- 取消保護現有Sheet,Password 為保護密碼
loExcel.ActiveSheet.Range(lcRange).Borders.LineStyle = nLineInt -- 設定上下左右的線條
loExcel.ActiveSheet.Range(lcRange).Border(nInt).LineStyle = nLineInt -- 依據 nInt 值設定哪一邊的線條
-- lcRange 為儲存格範圍,EX:A1:D10
-- nLineInt,1 和 7 為細實線、2 為細虛線、4 為點虛線、9 為雙細實線
-- nInt 參數為:1 - 左、2 - 右、3 - 上、4 - 下、5 - 左斜、6 - 右斜
loExcel.ActiveSheet.Range(lcRange).Borders.Weight = nInt
-- 設定邊框線粗細
loExcel.ActiveSheet.Cells(lnRows,lnColumns).VerticalAlignment = lnValue
loExcel.ActiveSheet.Rows(lnRows).VerticalAlignment = lnValue
loExcel.ActiveSheet.Columns(lnColumns).VerticalAlignment = lnValue
-- 設定垂直對齊方式,lnValue 1 為靠上對齊、2為置中對齊、3為靠下對齊
loExcel.ActiveSheet.Cells(lnRow,lnColumns).HorizontalAlignment = lnValue
loExcel.ActiveSheet.Rows(lnRows).HorizontalAlignment = lnValue
loExcel.ActiveSheet.Columns(lnColumns).HorizontalAlignment = lnValue
-- 設定水平對齊方式,lnValue 1 為向右對齊、2為向左對齊、3為置中對齊
loExcel.ActiveSheet.Rows(lnRows).Insert
-- 在第 lnRows 行前插入一行
loExcel.ActiveSheet.PageSetup.PaperSize = nPrinterSetting
-- 設定 Sheet 的紙張大小,常見設定值: 8 為 A3、9 為 A4
-- 查詢 Help 中的 PrtInfo() 可以查到全部紙張的 nPrinterSetting
loExcel.ActiveSheet.PageSetup.Orientation = nPrinterSetting
-- 設定 Sheet 紙張方向, 1 為直向、2 為橫向
loExcel.ActiveSheet.Range(lcRange).Merge
--合併資料格,lcRange 為儲存格範圍,EX:A1:D1
loExcel.ActiveSheet.PageSetup.TopMargin = 1 / 0.035 -- 上邊界
loExcel.ActiveSheet.PageSetup.BottomMargin = 1 / 0.035 -- 下邊界
loExcel.ActiveSheet.PageSetup.LeftMargin = 1 / 0.035 -- 左邊界
loExcel.ActiveSheet.PageSetup.RightMargin = 1 / 0.035 -- 右邊界
-- 設定邊界,1 / 0.035 = 1 mm
loExcel.ActiveSheet.PageSetup.LeftHeader = lcContent -- 頁首左邊
loExcel.ActiveSheet.PageSetup.CenterHeader = lcContent -- 頁首中間
loExcel.ActiveSheet.PageSetup.RightHeader = lcContent -- 頁首右邊
loExcel.ActiveSheet.PageSetup.LeftFooter = lcContent -- 頁尾左邊
loExcel.ActiveSheet.PageSetup.CenterFooter = lcContent -- 頁尾中間
loExcel.ActiveSheet.PageSetup.RightFooter = lcContent -- 頁尾右邊
loExcel.ActiveSheet.Columns(lnColumns).NumberFormatlocal = Format
-- Format 為欲設定格式
-- "@" 設定為文字
-- "G/通用格式" 設定為通用格式
-- "#,##0_ " 設定資料為數值,且有千分位符號
-- "[$-404]e/m/d;@" 西元年格式改為民國年格式
-- "[>99999999]0000-000-000;000-000-000" 行動電話、呼叫器號碼
loExcel.ActiveSheet.Cells(lnRows,lnColumns).Formula = Formula
-- Formula 設定公式
-- "=SUM(A1:B1)" 加總
-- "=AVERAGE(A1:B1)" 平均
-- 簡易實務範例:
-- loExcel.ActiveSheet.Cells(lnRows,lnColumns).Copy 選定某一格的公式
-- loExcel.ActiveSheet.RANGE(lcRange).SELECT 目標儲存格
-- loExcel.ActiveSheet.PASTE 進行公式複製
loExcel.SELECTION.WrapText = .T.
-- 自動換列
lcPrintTitleRange = "lnROWStart:lnROWEnd" -- EX: 1:3
loExcel.ActiveSheet.RANGE(lcPrintTitleRange).SELECT
loExcel.ActiveSheet.PageSetup.PrintTitleRows = lcPrintTitleRange
-- 設定列印標頭
loExcel.ActiveWindow.SplitColumn = lnCol
loExcel.ActiveWindow.SplitRow = lnRow
loExcel.ActiveWindow.FreezePanes = .T.
-- 凍結視窗設定
-- SplitColumn = lnCol 代表凍結前 N Column
-- SplitRow = lnRow 代表凍結前 N Row
loExcel.ActiveSheet.COLUMNS(lnColumns).HIDDEN = Visible
loExcel.ActiveSheet.ROWS(lnRows).HIDDEN = Visible
-- 隱藏 Column 或 Row;. Visible 為 T.為隱藏、.F.為顯示(預設值)
loExcel.DisplayAlerts = .F.
-- 關閉 Excel 警示,
-- EX1:未儲存前,嘗試關閉 Excel,會詢問是否要儲存
-- EX2:刪除 Sheet 時,會 DBCheck 是否要刪除 Sheet
-- EX3:合併儲存格會跳出警告
loExcel.ActiveWorkbook.Save
-- 對 Excel 進行儲存
loExcel.ActiveWorkbook.SaveAs("D:\Excel.XLSX")
-- 對 Excel 進行另存新檔
loExcel.ActiveWorkbook.SaveAs("D:\Excel.XLS" , FileFormat)
-- 對 Excel 進行另存新檔並轉為其他格式
-- FileFormat 為 56:97 - 2003 xls 格式
-- FileFormat 為 6:csv 格式
loExcel.Quit
-- 關閉 Excel
SELECT curData -- 欲匯出資料 Cursor
SCAN
FOR lnCount = 1 TO FCOUNT("curData")
lcField = EVALUATE(FIELD(lnCount)) -- 利用 Evaluate() 抓值
-- 假設已事先打開 Excel 物件
loExcel.Sheets(Var).cells(RECNO("curData"), lnCount) = lcField
-- 或 loExcel.ActiveSheet.cells(RECNO("curData"), lnCount) = lcField
ENDFOR
SELECT curData
ENDSCAN
-- 巨集內容
Sub Macro1()
ActiveCell.FormulaR1C1 = "916123456"
Range("A1").Select
Selection.NumberFormatLocal = "[>99999999]0000-000-000;000-000-000"
Application.Goto Reference:="Macro1"
End Sub
HighLight 的 "[>99999999]0000-000-000;000-000-000" 就是行動電話、呼叫器號碼的格式。DECLARE curTemp CURSOR Local Fast_Forward -- 宣告 Cursor 及其資料來源
FOR
(
SELECT Col1,Col2,Col3......
FROM SourceTable
WHERE Condition
)
OPEN curTemp -- 打開 Cursor,並建立 Cursor 與資料表關連
DECLARE @var1 as .....
DECLARE @var2 as .....
FETCH NEXT FROM curTemp INTO @var1,@var2 -- 將資料存進變數中
WHILE (@@FETCH_STATUS = 0) -- 檢查是否有讀取到資料
BEGIN
....................
FETCH NEXT FROM curTemp INTO @var1,@var2
END
CLOSE curTemp -- 關閉 Cursor,並關閉 Cursor 與資料表連結
DEALLOCATE curTemp -- 將 Cursor 物件移除
DECLARE @Temp Table (EmpNO char(5),EmpName nchar(8))
INSERt INTO @Temp VALUES ('00001','張三')
INSERt INTO @Temp VALUES ('00002','李四')
INSERt INTO @Temp VALUES ('00003','王五')
-- Cursor 的 T-SQL 延伸語法
DECLARE curTemp CURSOR STATIC -- 宣告此 Cursor 為 STATIC
FOR
(
SELECT EmpNO,EmpName
FROM @Temp
WHERE EmpNO IN ('00001','00002')
)
OPEN curTemp
DECLARE @EmpNO as char(5),@EmpName nchar(8)
DECLARE @Count as smallint
SET @Count = 0 -- 設定一個計數變數
FETCH NEXT FROM curTemp INTO @EmpNO,@EmpName
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @Count = @Count + 1
IF @Count = @@CURSOR_ROWS
PRINT '最後一筆資料為 ' + @EmpName
FETCH NEXT FROM curTemp INTO @EmpNO,@EmpName
END
CLOSE curTemp
DEALLOCATE curTemp
SELECT 1.0 / 0 -- 模擬除以零錯誤
SELECT
1.0 / NULLIF(T.[分母], 0) AS [利用 NULLIF],
1.0 / CASE WHEN T.[分母] = 0 THEN NULL ELSE T.[分母] END AS [利用 CASE WHEN 1],
CASE WHEN T.[分母] = 0 THEN NULL ELSE 1.0 / T.[分母] END AS [利用 CASE WHEN 2],
CASE WHEN T.[分母] = 0 THEN 0 ELSE 1.0 / T.[分母] END AS [利用 CASE WHEN 3],
CASE WHEN T.[分母] = 0 THEN '分母為0' ELSE '分母不為0' END AS [文字敘述]
FROM
(
SELECT 0 AS [分母]
UNION ALL
SELECT 3
) T
oFSO = CreateObject("Scripting.FileSystemObject")
oFSO.CopyFile((cOldFilePath),(cNewFilePath))
RELEASE oFSO
oFSO = CreateObject("Scripting.FileSystemObject")
oFSO.MoveFolder((cOldDirPath),(cNewDirPath))
RELEASE oFSO
MoveFolder可以用來搬移檔案,進階使用更改資料夾名稱,而更改檔案名稱也是一樣的用法。oFSO = CreateObject("Scripting.FileSystemObject")
oFSO.MoveFile((cOldFilePath),(cNewFilePath))
RELEASE oFSO
利用 RMDIR 或 RD 命令刪除資料夾時,出現 "The directory is not empty(目錄不是空的)" 錯誤,才發現資料夾內假如有隱藏的系統檔案,會無法刪除資料夾,EX:Thumbs.db,利用 FSO 即使有系統檔案也可以刪除資料夾。oFSO = CreateObject("Scripting.FileSystemObject")
oFSO.DeleteFolder((lcDirPath))
RELEASE oFSO
備註:作業系統從 Windows 98 開始有 WSH;只有 Windows 95 和 Windows NT 4.0 沒有-- 一:(*)不指定磁碟機名稱,電腦會自動指派一個可用名稱 NET USE * \\ComputerName\ShareName -- 二:(DeviceName)則是自己指派,EX:Z:。 NET USE DeviceName \\ComputerName\ShareName -- 三:輸入使用者帳密 NET USE * \\ComputerName\ShareName password /user:UserName
-- 建立範例資料
DECLARE @NY table (EmployeeID char(4),Employee char(8),Birthday datetime)
DECLARE @TW table (EmployeeID char(4),Employee char(8),Birthday datetime)
-- Ray 和 Doris 這兩個人名,同時存在 @TW 和 @NY 中
INSERT INTO @NY VALUES('NY01','Emma','19860606')
INSERT INTO @NY VALUES('NY02','Ray','19840404')
INSERT INTO @NY VALUES('NY03','Doris','19870707')
INSERT INTO @NY VALUES('NY04','Peggie','19890909')
INSERT INTO @NY VALUES('NY05','Angel','19810101')
INSERT INTO @TW VALUES('TW01','Terry','19901010')
INSERT INTO @TW VALUES('TW02','Ray','19820202')
INSERT INTO @TW VALUES('TW03','Doris','19830303')
INSERT INTO @TW VALUES('TW04','Fanny','19880808')
INSERT INTO @TW VALUES('TW05','Jarry','19850505')
SELECT
COALESCE(I.KeyFields,D.KeyFields) AS KeyFields, -- 利用 COALESCE() 來找出 KeyFields
'Kind' = CASE
WHEN D.KeyFields IS NULL THEN '新增' -- 利用 D.KeyFields IS NULL 來判斷是否為新增
WHEN I.KeyFields IS NULL THEN '刪除' -- 利用 I.KeyFields IS NULL 來判斷是否為刪除
WHEN I.KeyFields = D.KeyFields THEN '更新' -- 利用 I.KeyFields = D.KeyFields 來判斷是否為更新
END
FROM
inserted AS I
FULL JOIN -- 利用 FULL JOIN 來連結兩個暫存資料表
deleted AS D ON I.KeyFields AND D.KeyFields
-- 新增
IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)
-- 更新
IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
-- 刪除
IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
LOCAL dDate,dLastDay AS date
LOCAL iTotalDay AS integer
dDate = DATE() -- 使用者自訂日期
-- 先利用DATE() 來找出自訂日期月份的第一天,
-- 然後利用GOMONTH() 加一個月找到下個月第一天,
-- 再減一天,找到自訂日期月份的最後一天。
dMonthLastDate = GOMONTH(DATE(YEAR(dDate),MONTH(dDate),1),1)-1
-- 邏輯同上,最後再利用DAY()函數把天數抓出來就行
iTotalDay = DAY(dMonthLastDate)