星期五, 10月 26, 2012

[SQL] 利用 T-SQL 語法更改欄位資料型態

同事利用 ALTER TABLE 語法更改欄位資料型態時,發現欄位本身有預設值,導致更改資料型態時產生 Error,SQL Server 提供的錯誤訊息明確,也很輕鬆的解決這個問題。
USE Tempdb
GO

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

CREATE TABLE Demo
  (
    ID INT IDENTITY(1,1) ,
    Col1 char(10) NOT NULL DEFAULT('') -- 預設為空值
  )

ALTER TABLE Demo ALTER COLUMN Col1 INT -- 更改資料型態為 INT
  • 錯誤訊息
訊息 5074,層級 16,狀態 1,行 11
物件 'DF__Demo__Col1__35BCFEOA' 與資料行 'Col1' 相依。

查詢些資料來了解 ALTER TABLE 更改欄位資料型態時,要注意的事項
  1. 欄位資料型態是 ROWGUIDCOL(GUID),只能進行刪除欄位,不允許更改欄位資料型態。
  2. 計算欄位(computed column)或是複寫欄位(replicated column)無法變更資料型態。
  3. 定義為 Primary Key 或 Foreign Key 的欄位,無法更改資料型態。
  4. 更改欄位不可以參考計算爛位(computed column)。
  5. 任何資料型態無法變更為 timestamp。
  6. 欄位有設定 UNIQUE 或 CHECK 條件約束,只允許增加資料型態長度。
  7. 欄位有設定 DEFAULT 值,只允許增加或減少資料型態長度、是否允許 NULL 值或改變有效位數(precision或小數位值(scale)。
  8. 舊資料型態必須允許隱含轉換(implicit conversion)至新資料型態。
  9. 如果資料型態轉換過程中發生 overflow,轉換動作會被終止。
  10. 轉換成新資料型態後,ANSI_PADDING 的設定一定是 ON。
    下述兩點是實務上測試後有發現的資料,附上原文說明和自己的說明
    1. The modified column can't be a text, image, ntext, or rowversion(timestamp)column.   [text,image,ntext 或 rowversion(timestamp)無法變更資料型態],可以針對 text、ntext 直接轉為 varchar(MAX)
    2. If the modified column participates in an index, the only type changes that are allowed are increasing the length of a variable-length type (for example, varchar(10) to varchar(20), changing nullability of the column, or both) [欄位是索引欄位,只允許增加資料型態長度或是否允許 NULL 的改變。],測試 char、varchar 和 int 三種資料型態,只有 varchar 能直接增加長度,char 和 int 還是必須先卸除 Index,才能變化資料型態,另外 NULL 值只能從 NOT NULL 變成 NULL,無法從 NULL 改成 NOT NULL。

    星期五, 10月 19, 2012

    [Win] IE 增強式安全性設定

    使用 Windows Server 2008 練習時,用到 IE 就會出現安全性的詢問,直接把它關掉,減少麻煩,實務上當然是不建議這麼作 ~~
    • 開啟 IE 預設的增強式安全性設定說明
    [Windows] IE 增強式安全性設定-3
    • 輸入任何網站會出現的詢問視窗
    [Windows] IE 增強式安全性設定-4
    • 在伺服器管理員的右下角有個 "設定 IE ESC"
    [Windows] IE 增強式安全性設定-1
    • 把它關閉就行
    [Windows] IE 增強式安全性設定-2
    • 關閉後 IE 上的提示,進入任何網站時就不會再詢問囉
    [Windows] IE 增強式安全性設定-5

    星期五, 10月 12, 2012

    [SQL] SQL Server Agent Mail

    設定 SQL Server Agent Mail 可以讓 SQL Server Agent 擁有發送 mail 的功能。

    SQL Server Agent Mail,預設為關閉狀態,以下說明如何設定 SQL Server Agent Mail。
    • SQL Server Agent => 屬性。
    [SQL] SQL Server Agent Mail - 1
    • 警示系統 => 郵件工作階段 => 啟用郵件設定擋,選擇郵件系統和郵件設定擋。
    • 郵件系統:
      1. Database Mail:SQL Server Agent 會使用 Database Mail 傳送電子郵件。
      2. SQL Mail:SQL Server Agent 會使用「擴充 MAPI」介面傳送電子郵件。
      未來的 SQL 版本會移除 SQL Mail,請盡量不要使用它。
      • 郵件設定檔:指的是 Database Mail Profile。
      [SQL] SQL Server Agent Mail - 2
      • SQL Server Agent 會快取指定設定檔的設定檔資訊,當設定檔變更時,SQL Server Agent 不會立即使用新的資訊,必須重新啟動 SQL Server Agent 服務,才能使變更生效。
      [SQL] SQL Server Agent Mail - 3
      重新啟動 SQL Server Agent 後,即完成設定。

      星期五, 10月 05, 2012

      [Challenge] 階乘

      Beyond Relational TSQL Beginners Challenge 3

      This challenge though does not have any resemblance with the real time problem directly, but it measures about logical thinking. The problem is all about finding the factorial of numbers. Though it is known to most of us what a factorial is, but to recall the concept here is an example:

      Factorial of 3 is 1*2*3 = 6 i.e. the factorial of a non-negative integer n, denoted by n!, is the product of all positive integers less than or equal to n.
      • Sample Data
      Nums
      -----------
      0 
      1 
      3 
      5 
      10
      
      • Expected Results
      Nums        Factorial
      ----------- -----------
      0                    1
      1                    1
      3                    6
      5                  120
      10             3628800
      
      • Rules
        1. Nums should be sorted in Ascending Order.
        2. The program should run in SQL SERVER 2005 and above.
        3. The output should be in the same way as it has been shown. Column names should be exactly the same and the result must be sorted in Ascending order of Nums.
        4. The program has to be done by a single query and should begin either with a SELECT or WITH statement with no variables, temporary table, table variables permitted.
        5. You cannot use RBAR, cursors, loops etc. in your program.