2026年3月25日 星期三

營利事業統一編號檢查碼邏輯修正

 營利事業統一編號檢查碼邏輯修正

--

舊版的統一編號邏輯檢查已經不適用囉!


趕緊修正一下




   Public Shared Function NEW_ValidateTaxID(ByVal vstrTaxID As String) As Boolean


        '空值或非8碼或非純數字


        If String.IsNullOrEmpty(vstrTaxID) OrElse vstrTaxID.Trim().Length <> 8 OrElse Not Integer.TryParse(vstrTaxID, Nothing) Then


            Return False


        End If




        Dim TaxID_7 As Boolean = (vstrTaxID.Substring(6, 1) = "7")


        Dim logics As Integer() = New Integer() {1, 2, 1, 2, 1, 2, 4, 1} '邏輯乘數


        Dim Z As Integer = 0 '垂直乘積之和 全部加總


        Dim Z1 As Integer = 0


        Dim Z2 As Integer = 0




        '邏輯乘數的數量與統編長度8碼一致


        For i As Integer = 0 To logics.Length - 1


            Dim num As Integer = Convert.ToInt32(vstrTaxID.Substring(i, 1)) '統編單一數字拆解


            Dim j As Integer = num * logics(i) '乘積直寫並上下相加


            Dim SumXX As Integer = (j \ 10) + (j Mod 10) '垂直乘積之和(上下數字相加)




            If TaxID_7 AndAlso i = 6 Then '統編第7位數字是"7" && 走訪到統編第7位數字時


                '"乘積之和"為"10",但政府文件要我們取"0或1"兩種情況(不是10)來相加。


                Z1 += 0


                Z2 += 1


                'Z 不理它


            Else


                Z += SumXX


                Z1 += SumXX


                Z2 += SumXX


            End If


        Next 'end for




        'int old_checkNum = 10; '2023年以前的舊版


        Dim checkNum As Integer = 5




        If TaxID_7 Then


            If (Z1 Mod checkNum = 0) OrElse (Z2 Mod checkNum = 0) Then


                Return True


            End If


        ElseIf Z Mod checkNum = 0 Then


            Return True


        End If




        Return False


    End Function

2026年3月18日 星期三

MS-SQL 分頁

引用來源: [MSSQL]分頁

---

方法一 : 使用ROW_NUMBER()搭配OVER(ORDER BY Field)(SQL Server 2008 開始)

ROW_NUMBER()

ROW_NUMBER ( )

    OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )

先用ROW_NUMBER()替每筆資料設定編號,再根據條件取得分頁內容(ROW_NUMBER從1開始)

DECLARE @PageIndex INT = 1, @PageSize INT = 25


SELECT * FROM

(

    SELECT

        *, ROW_NUMBER() OVER (ORDER BY FieldA DESC) as RowId

    FROM

        TableA

    WHERE

        Conditions

) AS vw

WHERE

    RowId BETWEEN (@PageIndex - 1) * @PageSize + 1 AND @PageIndex * @PageSize

方法二 : 使用OFFSET搭配FETCH(SQL Server 2012 開始)

OFFSET FETCH


OFFSET - FETCH 是 ORDER BY 子句的延伸功能。


FETCH

          [ [ NEXT | PRIOR | FIRST | LAST

                    | ABSOLUTE { n | @nvar }

                    | RELATIVE { n | @nvar }

               ]

               FROM

          ]

{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }

[ INTO @variable_name [ ,...n ] ]

可以指定跳過的行數,指定要取回的資料列筆數(要從跳過 0 ROW開始)

DECLARE @PageIndex INT = 1, @PageSize INT = 25


SELECT

    *

FROM

    TableA

ORDER BY

    FieldA DESC

OFFSET (@PageIndex - 1)*@PageSize ROWS

FETCH NEXT @PageSize ROWS ONLY;

FETCH 寫法效能比 ROW_NUMBER() 快很多


2026年1月22日 星期四

MS-SQL 找尋 約束

 /*顯示資料內所有約束*/

SELECT * FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('A_TMP')

/*找詢約束*/

if (SELECT count(name) FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('A_TMP') and name='A_prod_name')>0

begin

   print '1'

end 

else

begin

   print '0'

end

2025年11月20日 星期四

使用 Robocopy 進行「資料夾」鏡像同步

參考來源+引用: 【程式開發筆記】讓電腦定時幫你備份重要資料,「鏡像同步、差異備份」樣樣通,Robocopy - 大漠國渡 

---

使用 Robocopy 進行「資料夾」鏡像同步

輸入「Robocopy <你的來源資料夾> <你的目的地資料夾> /mir /xo /e」

範例 : Robocopy D:\TEST D:\TEST2 /mir /xo /e

接下來將檔案儲存程「Windows 批次檔案 (.bat)」,「檔名」跟「路徑」就自己決定吧


// 第一種,會覆寫「目的地資料夾」安全性設定。

Robocopy <來源資料夾(檔案)> <目的地資料夾(檔案)> /mir /xo /e

// 第二種,不覆寫「目的地資料夾」安全性設定。

Robocopy <來源資料夾(檔案)> <目的地資料夾(檔案)> /e /xo /purge


「指令參數」說明

/e

複製子資料夾 (包含空的資料夾)

/xo

比較「來源檔案」與「目的地檔案」,若「來源檔案」較新則複製,否則排除不複製 (差異備份,所需參數)

/purge

刪除不存在於「來源資料夾」中的檔案 (差異備份,所需參數)

/mir 

鏡像資料夾 (相當於同時使用 /e 和 /purge 參數)。


「進階指令」說明

Robocopy <來源資料夾(檔案)> <目的地資料夾(檔案)> /e /xo /mir /mt: /dcopy:dat /xa:sh /xj /unicode /eta /R:5 /W:30 /tee /unilog+:D:\mirrorDir.txt /v

「指令參數」說明

/mt:<n> 

使用 n 個執行緒,執行工作。(如同 n 個人一起搬運檔案) 預設值是 8,最上值128。

需搭配使用 /log 參數,集中倒出,提升效能。

  

/log:<logfile>

使用系統編碼(Big5)寫入記錄檔。(若記錄檔已存在,覆寫現有的記錄檔)


/log+:<logfile>

使用系統編碼(Big5)寫入記錄檔。(若記錄檔已存在,接續寫入記錄檔)


/unilog:<logfile>

使用 UTF-8 編碼寫入記錄檔。(若記錄檔已存在,覆寫現有的記錄檔)


/unilog+:<logfile>

使用 UTF-8 編碼寫入記錄檔。(若記錄檔已存在,接續寫入記錄檔)


/dcopy:<copyflags> 

複製資料夾的內容。

D - 資料

A - 屬性

T - 時間戳記

E - 擴充屬性

X - 略過替代資料流

此選項的預設值為 DA (資料和屬性)。


/xa:[RASHCNETO]

符合以下屬性的檔案不處理。

R - 唯讀

A - 封存

S - 系統

H - 隱藏

C - 已壓縮

N - 未編製內容索引

E - 已加密

T - 暫存

O - 離線


/xj  

不複製 NTFS junction 檔案。


/unicode 

輸出內容使用 UTF-8 編碼。


/eta

顯示所複製檔案的預估抵達時間 (ETA)。


/r:<n> 

複製失敗,重新嘗試的次數,n 的預設值為 1,000,000 (一百萬次重試)。


/w:<n> 

複製失敗,重新嘗試的等候時間,以秒為單位,n 的預設值為 30 (等待時間為 30 秒)。


/tee 

將狀態輸出寫入主控台視窗及記錄檔。


/v 

產生詳細資訊輸出,並顯示所有略過的檔案。


1. 「鏡像同步」最終指令

Robocopy <來源資料夾(檔案)> <目的地資料夾(檔案)> /e /xo /mir /mt: /dcopy:dat /xa:sh /xj /unicode /eta /R:5 /W:30 /tee /unilog+:D:\mirrorDir.txt /v /xf *.tmp *.ds_store *.temp ~desktop.ini ~hiberfil.sys ~pagefile.sys ~thumbs.db ~swapfile.sys ~NTUSER.DAT ~ntuser.dat.LOG1 ~ntuser.dat.LOG2 $recycle.bin config.msi ntuser.dat ntuser.ini /xd "C:\Windows" "C:\ProgramData\Microsoft\Windows\Caches" "C:\Drivers" "C:\Temp" "C:\Documents and Settings" "*MSOCache*" "*RecycleBin*" "*recycler*" "*System Volume Information*"


「指令參數」說明


/xf <filename>[ ...]

符合指定名稱或路徑的檔案,支援使用萬用字元 (* 和 ?)。


*.tmp 

*.ds_store 

*.temp 

~desktop.ini 

~hiberfil.sys 

~pagefile.sys 

~thumbs.db 

~swapfile.sys 

~NTUSER.DAT 

~ntuser.dat.LOG1 

~ntuser.dat.LOG2 

$recycle.bin 

config.msi 

ntuser.dat 

ntuser.ini 


/xd <directory>[ ...] 

排除符合指定名稱和路徑的目錄。


"C:\Windows" 

"C:\ProgramData\Microsoft\Windows\Caches" 

"C:\Drivers" 

"C:\Temp" 

"C:\Documents and Settings" 

"*MSOCache*" 

"*RecycleBin*" 

"*recycler*" 

"*System Volume Information*"



2025年11月3日 星期一

SQL 取資料表所有欄位

 


SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, IS_NULLABLE

FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'table name'