顯示具有 SQL 標籤的文章。 顯示所有文章
顯示具有 SQL 標籤的文章。 顯示所有文章

2009/04/03

Trigger Error Handling For ASP

最近遇到一個情況,在A資料表內有不同的trigger,其中有個trigger 1的作法是在update數量時要去同時update另一個B資料表的數量,
而這個A資料表的另一個trigger 2也會被執行,如果這時trigger 1內的另一個C資料內的Constraint裡觸發時,ASP的ADO會誤以為Trigger 2執行成功,
而不會返回錯誤,以致於程式裡無法作error handling

此時的解法就只能去調整trigger的執行順序,讓有Constraint的Trigger能先被執行,這樣才能抓到錯誤。
以下是範例示範:


-- 1. Constraint : CK_MyProduct_Qty_Selling
ALTER TABLE [dbo].[MyProduct] WITH NOCHECK ADD CONSTRAINT [CK_MyProduct_Qty_Selling]
CHECK (([MyProductQty]-[MyProductQtySelling])>=(0) AND [MyProductQty]>(0))
GO
ALTER TABLE [dbo].[MyProduct] CHECK CONSTRAINT [CK_MyProduct_Qty_Selling]

-- 2. Trigger : InsertLog
CREATE TRIGGER [dbo].[TRI_InsertLog]
ON [dbo].[JesseWangDB]
FOR UPDATE
AS
BEGIN
IF UPDATE (Product_Qty)
BEGIN
INSERT MyLog .....
END
END
GO

-- 3. Trigger : UpdateDetails
CREATE TRIGGER [dbo].[TRI_UpdateDetails]
ON [dbo].[JesseWangDB]
FOR UPDATE
AS
DECLARE @OldProductId int

BEGIN
IF UPDATE (Product_QtySelling)
BEGIN
SELECT @OldProductId=ProductId FROM deleted

UPDATE MyStock
SET MyStockQty = MyStockQty + 1
WHERE MyStockProductId = @OldProductId
END
END
GO


當我執行以下程式時,觸發MyStock的Constraint :



UPDATE MyProduct SET MyProductQtySelling = MyProductQtySelling + 1 WHERE MyProductId = 38382


結果:


(1 個資料列受到影響)
訊息 547,層級 16,狀態 0,程序 TRI_UpdateDetails,行 29
UPDATE 陳述式與 CHECK 條件約束 "CK_MyProduct_Qty_Selling" 衝突。衝突發生在資料庫 "JesseWangDB",資料表 "dbo.MyProduct"。
陳述式已經結束。


因為TRI_InsertLog先被執行到了,所以ASP的ADO誤以為執行結果無誤。

所以我們要調整Trigger順序


EXEC sp_settriggerorder @triggername=N'[dbo].[TRI_UpdateDetails]', @order=N'First', @stmttype=N'UPDATE'


調整後的結果:


訊息 547,層級 16,狀態 0,程序 TRI_UpdateDetails,行 29
UPDATE 陳述式與 CHECK 條件約束 "CK_MyProduct_Qty_Selling" 衝突。衝突發生在資料庫 "JesseWangDB",資料表 "dbo.MyProduct"。
陳述式已經結束。


這樣ASP的ADO就可以抓到error了。

2009/01/16

[SQL] 使用 SQL 指令作分頁處理 - CTE

可參考這篇文章:

My Program:利用CTE將分頁資料取出-Stored Procedure篇

簡單指令參考:


with myctequery as (
select row_number() over ( ORDER BY order_code DESC ) as CTESN ,
select * from orders (nolock) )
select * from myctequery
where CTESN between 1 and 10 -- 傳入要帶入的分頁筆數

缺點是要先count一次orders的總筆數,才能決定共有幾頁。
效能在前幾頁是最好的,但隨著資料量愈大,移到愈後面的頁數效能會遞減...

2008/11/14

[SQL]遇到欄位資料型別為xml時,不可使用union的問題

會出現:
不能選取 xml 資料類型作為 DISTINCT,因為無法比較。

改為使用union all即可....




select product_id, product_name, product_xmlrule
from product1
where product_date > getdate()
union all
select product_id, product_name, product_xmlrule
from product2
where product_status = 0

2008/09/03

SQL Server 在 charindex 全形及半形判斷上的問題

在預設的情況下,中文的SQL Server的定序設定為Chinese_Taiwan_Stroke_CI_AS, 會把全形及半形視為相同字元,這會影響到我們在SUBSTRING及CARINDEX上的判斷,如果字串內同時有全形及半形的符號,SQL Server皆會把它視為相同的符號...
如果我們在不能改資料庫設定的情況下,如何讓全形及半形的符號有所區隔呢?

直接用以下例子說明:



declare @txt nvarchar(200)
select @txt = '華,碩平,台【重裝火炮】DVD燒錄遊戲電腦'

select charindex(',', @txt)
select charindex(',', @txt COLLATE Chinese_Taiwan_Stroke_CI_AS_WS)


結果:

-----------
2

(1 個資料列受到影響)


-----------
5

(1 個資料列受到影響)

update:
如何執行區分全型/半型的sql select?
select * from aaa(nolock) where aaa_name like '%?%' COLLATE Chinese_Taiwan_Stroke_CI_AS_WS
-- COLLATE Chinese_Taiwan_Stroke_CI_AS_WS放在like的後面



重點就在於預設的COLLATE是Chinese_Taiwan_Stroke_CI_AS,改成Chinese_Taiwan_Stroke_CI_AS_WS就OK了,詳細請參考:

1.Windows Collation Name (Transact-SQL)
2.COLLATE (Transact-SQL)
3.Collation Precedence
4.定序對話方塊 (Visual Database Tools)

PHILIPS移動世界 2.5吋 250G SATA行動硬碟-聯強貨

2007/11/12

Restore Database時,發生錯誤3154的原因

以前在用SQL 2000時,Restore db都是先新增一個空的db,然後再按還原資料庫,
但是換到SQL 2005時,這樣做卻會失敗,
所以現在如果你的資料庫是使用SQL 2005,還原資料庫時不用再新增一個空的db了,

1.直接在「物件總管」中的「資料庫」上按右鍵,選取「還原資料庫」


2.在「目的地資料庫」中輸入資料庫的名稱



3.記得修改原始檔案名稱的檔案路徑




詳細的可以參考這篇討論:http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=594642&SiteID=1

2006/08/28

[SQL]安裝SQL 2005 SP1時發生的怪問題

為什麼要裝SQL 2005 SP1呢?
因為不裝SP1就無法使用匯入資料的功能,會出現「產品層級不夠」的錯誤訊息....

找到解決方案了,高高興興的去下載SP1來安裝,安裝到最後卻發生「Unable to install Windows Installer MSP file」的錯誤....

不想多說了,看這裡吧><....BUG: Error message when you try to install SQL Server 2005 Service Pack 1: "Unable to install Windows Installer MSP file"

沒有Google的世界該怎麼辦呀!!

2005/01/30

[SQL]Setup Replication 時發生「Could not connect to server [ServerName] because 'distributor_admin' is not defined as a remote login at the server.」

在SQL 2000建立發行集時,發生以下錯誤:

Could not connect to server [ServerName] because 'distributor_admin' is not defined as a remote login at the server.

可能是安裝完SQL Server後又變更Windows Server的Server Name所導致,請執行以下指令確認一下:

SELECT @@Servername
GO
SELECT SERVERPROPERTY('ServerName')

如果兩個結果出來的不一樣,代表問題的原因就如我所說的,執行以下指令將Server Name改過來

Use Mastergo
Sp_DropServer 'OldServerName'
GO
Use Master
GO
Sp_Addserver 'YourServerNameNow', 'local'
GO

再去設定一次Replication應該就可以了...

2005/01/20

[SQL]如何設定informix到SQL Server 2000 的Linked Server?



首先你要先安裝好informix的ODBC Driver並且設定可以連結到informix db。開啟Enterprise Manager後,找到連結伺服器(SQL Server群組-->安全性),按右鍵「新增連結伺服器」:

提供者名稱:Microsoft OLE DB Provider for ODBC Drivers
產品名稱:Informix-CLI 2.5 (32 bit)
資料來源:ODBC的系統資料來源名稱

設定好之後,到「安全性」選擇「使用下列安全性條件進行連線」,輸入登入資料庫的帳號&密碼即可。

若使用Query Analyer,執行以下指令:

EXEC sp_addlinkedserver
@server = 'MyInfoDBSrv', -- 資料庫的server name
@provider = 'MSDASQL', -- Microsoft OLE DB Provider for ODBC
@datasrc = 'infordb', -- db name
@srvproduct = 'Informix-CLI 2.5 (32 bit)' -- product version
GO
EXEC sp_addlinkedsrvlogin 'MyInfoDBSrv', 'false', 'sa', 'login_name', 'password'

使用Linked Server記得要使用four-part name,如下:

SELECT * FROM MyInfoDBSrv.infordb.dbowner.table

2005/01/12

[MCDBA]Querying Microsoft SQL Server 2000 with Transact-SQL Workbook - Module1:Introduction to Transact-SQL

SQL = Structured Query Language

符合ANSI-SQL語法才可以跨資料庫共用

T-SQL三種類型:
物件型 Data Definition Language Statements (DDL) :

  • CREATE object_name : 新增物件
  • ALTER object_name : 修改物件
  • DROP object_name : 刪除物件


控制型 Data ControlLanguage Statements (DCL) :

  • GRANT : 授權
  • DENY : 不授權
  • REVOKE : 取消授權,繼承群組的權限

操作型 Data ManipulationLanguage Statements (DML) :

  • SELECT : 搜尋資料
  • INSERT : 新增資料
  • UPDATE : 修改資料
  • DELETE : 刪除資料

註解 Comments

單行註解 In-line Comments:

SELECT productname

, (unitsinstock - unitsonorder) -- Calculates inventory

, supplierID

FROM products

GO

多行註解 Block Comments:

/*

This code retrieves pala pala ....

....

*/

USE Northwind

SELECT * FROM Employees

保留字 Identifiers

  • 第一個字必為字母
  • 物件中有空格或保留字時使用[]或"" : 例如 SELECT * FROM [Blanks In Table Name]
  • @Local : Local變數
  • @@Global : Glocal變數或Function
  • #Local : Local Temp Table
  • ##Global : Global Temp Table
  • % : 1.萬用字元 2.取餘數(Modulo)
  • 名字不要取太長
  • 命名時可看出物件的型態;如:sp_StoredProcedures1, vw_VeiwTable1 ...等
  • 物件名稱儘量唯一,例如有一個Table Name為Customers,則View的名稱就不要再命名為Customers

資料型別 Types of Data

數值:

1.整數:

  • BigInt 8
  • Int 4
  • Smallint 2
  • Tinyint 1 0~255

2.小數:

  • decimal(10,3) : 10位數,3位小數,所以是7位整數+3位小數。
  • numeric : 用法同上。

3.浮點數:

  • float
  • real

P.S.浮點數不可為PK值,因為浮點數的精準度較差。

字串:

  • char(10) : 固定長度
  • nchar(10) : 固定長度,Unicode
  • Varchar(40) : 變動長度 (只能存20個中文字)
  • NVarchar(40) : 變動長度,Unicode (因為是Unicode,所以可以實際存到40個中文字)

日期:

  • datetime
  • smalldatetime : 只存日期

其它:

  • image
  • text

P.S.image及text的長度不受限制,只在欄位內存一個Point,代表實際資料存放的位置;因為是另外存放所以image及text的存取效能較差

2004/11/30

[SQL]如何找到SQL 2000 Transact-SQL Reference?

Transact-SQL 的語法怎麼使用呢?
到MSDN網站找找吧。
進入MSDN的網站,在以下路徑就可以找到Transact-SQL Refence了。

MSDN Home > MSDN Library > Servers and Enterprise Development > SQL Server > SQL Server 2000 > Transact-SQL Reference

軟體工程的重要的指標