2017年11月19日 星期日

SQL 語法也能用 IF

SQL 語法也能用 IF
IF EXISTS(SELECT 1 FROM Sales.StoreContact WHERE CustomerID = 24)
    UPDATE table1 SET (...) WHERE Column1='SomeValue'
ELSE
    INSERT INTO table1 VALUES (...)
IF 判斷式的 SELECT 只是要確認是否有值,因此建議使用 'SELECT 1' 取代 'SELECT *'

可以用 IF EXISTS 當然也能用 IF NOT EXISTS
IF NOT EXISTS(SELECT 1 FROM Employee WHERE Id = @Id)
    INSERT INTO table1 VALUES (...)
ELSE
    SELECT -1

引用
楓花雪岳-IF EXISTS VS SELECT COUNT(*)
風箏-SQL IF EXISTS update else insert

SQL 語法排版

原始 SQL 字串要排版換行須不斷使用 '+',
但只要在字串前 '@',不需要使用 '+'也可以換行

原始
string scmdst = "UPDATE Department " +
                "SET Name = @Name " +
                "WHERE Id = @Id";

使用 '@'
string scmdst = @"UPDATE Department
                SET Name = @Name
                WHERE Id = @Id";

SQLParameter

在 C# 中撰寫 SQL 語法可以不須一直用 '+' 連接變數,可用 Parameters 把值放入 SQL 字串
原始
string queryString = "insert into mytable (myregion,myname) values(N' " + region + "',N'" + name + "' )";

使用 Parameters
using System.Data.SqlClient ;

string queryString = "insert into mytable (myregion,myname) values(@myregion,@myname)";
SqlConnection cn = new SqlConnection(cs);
SqlCommand cmd = new SqlCommand(queryString, cn);
cmd.Parameters.AddWithValue("@myregion", region);
cmd.Parameters.AddWithValue("@myname", name);
cmd.ExecuteNonQuery();
引入方式有多種
1.
cmd.Parameters.Add("@myregion", SqlDbType.NVarChar); 
cmd.Parameters["@myregion"].Value = region;
2.
cmd.Parameters.AddWithValue("@myregion", region);
3.
cmd.Parameters.Add(new SqlParameter("@myregion", region));

引用
余小章-如何使用 SQLParameter 物件

2017年11月18日 星期六

WITH(NOLOCK)

SQL 語法中在 table 名稱後加 WITH(NOLOCK),可防止查詢時因資料變動而卡住,提升查詢速度,但取出的資料並不一定是最新的
若查詢 JOIN 多個 table,則每個 table 名稱後都需加 WITH(NOLOCK)
若有資料正在被更動,查詢也不需等更動完才能顯示
壞處是取出的資料不一定是正確的,正在被更動的資料就會顯示較舊的數值

SELECT sum(amt)
FROM NLEdiTax WITH(NOLOCK)
WHERE IDATE>='2013.03.01' and IDATE <='2013.03.15'
SELECT COUNT(UserID)
FROM EMPLOYEE WITH (NOLOCK)
            JOIN WORKING_GROUP WITH (NOLOCK) ON 
            EMPLOYEE.UserID = WORKING_GROUP.UserID 

引用資料
隨手寫寫筆記-提升查詢效率和避免LOCK發生