blogspot.com-GA4

星期二, 3月 23, 2010

OPENXML (Transact-SQL)用 SQL語法抓取 XML格式檔案

參考來源

讀取資料來源

DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
<Child>SON</Child>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
<OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>
'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.


顯示SQL讀取 XML

方式一

SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer',1)
WITH (CustomerID varchar(10),
ContactName varchar(20),
Child varchar(10))


以下為結果集:
CustomerID ContactName Child
---------- -------------------- ------------------
VINET Paul Henriot NULL
LILAS Carlos Gonzlez NULL


如果相同的 SELECT 陳述式以 flags 設為 2 來執行 (表示元素中心對應),由於 元素不具有任何子元素,因此 XML 文件中兩個客戶的 CustomerID 及 ContactName 值會以 NULL 傳回。

※ 在文章中沒有寫到子元素的部分,紅色部分為子元素的結果,補充子元素的部分

以下為結果集:

CustomerID ContactName Child
---------- ----------- ------------------
NULL NULL SON
NULL NULL NULL

因此如果要子元素同顯示,則要改用可指定名稱


方式二

SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
WITH (OrderID int '../@OrderID',
CustomerID varchar(10) '../@CustomerID',
OrderDate datetime '../@OrderDate',
ProdID int '@ProductID',
Qty int '@Quantity',
Child varchar(10) '/ROOT/Customer/Child'
)


以下為結果集:
OrderID CustomerID OrderDate ProdID Qty Child
------------------------------------------------------------------------
10248 VINET 1996-07-04 00:00:00.000 11 12 SON
10248 VINET 1996-07-04 00:00:00.000 42 10 SON
10283 LILAS 1996-08-16 00:00:00.000 72 3 SON


方式三:擷取邊緣資料表中的所有資料行。

SELECT *
FROM OPENXML (@idoc, '/ROOT/Customers')
EXEC sp_xml_removedocument @idoc

星期二, 3月 16, 2010

java新手犯的錯可讓人啼笑皆非~~String 比對

最近工作接到了某個公司的派遣~~真的遇到了以下的錯誤,
而這在Java語法裡面是有代表著不同的意義。

String的 三種比對 = =、equals、compareTo
1. = = 這種比對方式在其他語言中可以直接用來做字串的比對,
但是在Java中這樣的比對是用來檢查,引用關聯記憶體使用的物件是否相同,
所以當 new 兩個String時,這樣的比對馬上就出問題了

2. equals 這個方法才是Java正確的字串比對方式,而對於物件需要做比對時,也是使用此方式,而數字是用 = =

3. compareTo 這種方式是用來做字串的比對大小時使用的,可不是用來比對是否相等,但是居然還是有看到有人拿來做比對用,雖然是可以,但我個人還是非常不建議這樣子用


這是我目前看到有新手用了 1.3種方法來做比對,
雖然第3種方法可以,但在比對相同情形下還是不建議使用,
另外有Comarator 物件可以用來做比對排序