撰寫國際通用的 Transact-SQL 陳述式

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

如果遵循下列的指導方針,使用 Transact-SQL 陳述式的資料庫與資料庫應用程式將更能從一個語言移植至另一個語言,或可支援多種語言:

  • 從 SQL Server 2019 (15.x) 開始,以及在 Azure SQL Database 中,請使用:

    • charvarcharvarchar(max) 資料類型 (使用啟用 UTF-8 的定序),則會使用 UTF-8 來編碼資料。
    • ncharnvarcharnvarchar(max) 資料類型 (使用啟用增補字元 (SC) 的定序),則會使用 UTF-16 來編碼資料。 使用非 SC 定序會導致使用 UCS-2 來編碼資料。

    這可避免字碼頁轉換問題。 如需其它考量事項,請參閱 UTF-8 和 UTF-16 間的儲存差異

  • 最多到 SQL Server 2017 (14.x),使用 ncharnvarcharnvarchar(max) 來取代所有使用的 charvarcharvarchar(max) 資料類型。 如果使用啟用增補字元 (SC) 的定序,則會使用 UTF-16 來編碼資料。 使用非 SC 定序會導致使用 UCS-2 來編碼資料。 這可避免字碼頁轉換問題。 如需詳細資訊,請參閱 Collation and Unicode Support

    重要

    text 資料類型已淘汰,不應用於新的開發工作。 計劃將 text 資料轉換為 varchar(max)

  • 您在執行月份和週中日的比較和運算時,請使用數值的日期部分,而不要使用名稱字串。 不同的語言設定會傳回不同的月份和週中日名稱。 例如,語言設定為「英文 (美國)」時,DATENAME(MONTH,GETDATE()) 會傳回 May;當語言設定為「德文」時,會傳回 Mai;而當語言設定為「法文」時,會傳回 mai。 請改用如 DATEPART 的函式,使用數字月份而非名稱。 當您要將結果集顯示給使用者時,請使用 DATEPART 名稱,因為日期名稱通常比數值表示法來得有意義。 但是,不要根據特定語言的顯示名稱來撰寫任何程式碼邏輯。

  • 當您在比較或輸入至 INSERT 或 UPDATE 陳述式中指定日期時,請使用所有語言設定都作相同解譯的常數:

    • ADO、OLE DB 和 ODBC 應用程式應該使用以下形式的 ODBC 時間戳記、日期和時間逸出子句:

      { ts'yyyy-mm-ddhh:mm:ss [.fff] '},例如:{ ts'1998-09-24 10:02:20'}

      { d'yyyy-mm-dd'},例如:{ d'1998-09-24'}

      { t'hh:mm:ss'},例如:{ t'10:02:20'}

    • 使用其他 API 或 Transact-SQL 指令碼、預存程序和觸發程序的應用程式,應該使用未分隔的數值字串。 例如 yyyymmdd 為 19980924。

    • 使用其他 API 的應用程式,或 Transact-SQL 指令碼、預存程序及觸發程序,都應該針對 timedatesmalldatedatetimedatetime2datetimeoffset 資料類型與字元字串資料類型之間的所有轉換,使用具有明確樣式參數的 CONVERT 陳述式。 例如,下列陳述式在所有日期格式連接設定下的解譯都是一樣的:

      SELECT *  
      FROM AdventureWorks2022.Sales.SalesOrderHeader  
      WHERE OrderDate = CONVERT(DATETIME, '20060719', 101)  
      

另請參閱

CAST 和 CONVERT (Transact-SQL)
DATEPART (Transact-SQL)
定序與 Unicode 支援