結婚與愛情

別人分享的文章….深有感觸


 

從小我們就以為結婚就是Happy Ending:「從此過著幸福快樂的日子」,我們以為結婚了就幸福了,就拿到愛情的證書、就是愛情的終點。

長大後、成熟後,自己經歷了感情、看多了旁人的婚姻,才發現,原來,結了婚過的幸福的並沒有想像中那麼多,甚至不幸福的用各種理由撐著婚姻的更多。

原來,有的感情可以同甘、不能共苦,有的禁得起風雨,但禁不起平凡。相愛那一刻,彼此可以海誓山盟,不愛的時候,你連多看他一眼都嫌煩。人會變、愛會變,有的婚姻沒有了愛情,還有親情、道義、習慣,甚至金錢來維繫,有的人可以接受沒有愛情的婚姻,有的人卻不能。
婚姻,大部分的時候不是為了愛情而活,是為了生活而活。年紀漸長,我們不得不承認,相處比相愛重要,因為再浪漫的愛情,都會被生活瑣事、家庭關係所磨滅。海誓山盟可能抵不過你今天垃圾忘了丟。

不相愛的兩人,卡在婚姻裡成了怨偶,或許,他們離開了婚姻,可以變成朋友。其實我們更要欣賞他們的誠實和勇敢,真正的勇敢不是忍耐一段發爛的關係委屈求全、自欺欺人,而是懂得放手、放過自己、放過別人,因為你還有讓自己幸福的能力。人生並不是只有一條路可以走。

或許我們現在唸童話故事給孩子聽時,我們要改一下「從此幸福快樂」的說法,而是告訴他們,不管一段關係之後會不會讓你幸福,你都要擁有跳出高塔、活出自我的勇氣。

人沒有完美,幸福也沒有完美。我們都會犯錯、都在學習,我們都愛過,也都痛過,對於過去,好好放下,對於別人,多給祝福。不愛你的人也曾對你好過,記得好就好,恨別人只是傷了自己。

幸福沒有Happy Ending,而是把握每一天,把它當作相愛的第一天、活著的最後一天來過,活在當下、愛在當下,且行且珍惜。

最後你會發現,真正的幸福不一定是來自於愛情,而是來自於你自己的內心。

[SQL]將多筆資料合併為一筆顯示(FOR XML PATH)

原文:[SQL]將多筆資料合併為一筆顯示(FOR XML PATH)

用北風資料庫舉例

step1:先讓我們看看orderID = ‘10248’的產品有哪些


SELECT * FROM [Order Details] 
where OrderID = '10248'

有這些

step2:然後我們利用for xml path把他合併顯示


SELECT cast(ProductID AS NVARCHAR ) + ',' from [Order Details] 
where OrderID = '10248'
FOR XML PATH('')

輸出是這樣,可以發現果然productID都合併了

step3:然後改成顯示所有的order的productID


SELECT OrderID,(SELECT cast(ProductID AS NVARCHAR ) + ',' from [Order Details] 
where OrderID = ord.OrderID
FOR XML PATH('')) as productIDs
from orders ord
GROUP BY orderid

輸出像是這樣,所有的order的productID,但是productID還多一個逗號

step4:最後動些手腳,輸出就完美了,成功的將多筆資料合併為一筆


SELECT m.OrderID ,left(m.productIDs,len(m.productIDs)-1) as productIDsFinal from 
(SELECT OrderID,(SELECT cast(ProductID AS NVARCHAR ) + ',' from [Order Details] 
where OrderID = ord.OrderID
FOR XML PATH('')) as productIDs
from orders ord
GROUP BY orderid) M --這個M一定要加,不知道為啥
ORDER by M.OrderID 

最後輸出:

踩到我的點

這次的NZ行,同行友人說我和另一位男生的脾氣怎麼那麼好,都不會生氣。
我回「是因為沒有踩到我的點,要不然我的脾氣是很不好的」

不禁讓我思考,什麼是我的點?
談我的前女友?指責我不是?鬼打牆問問題?
就算指著我罵也不一定生氣,反覺得遇到神經病而一笑置之,沒想到自己的修養變好了…哈哈!!

要說一定會讓我生氣的事,應該是對我身旁的人不禮貌吧!!
我一向很重視這類表面功夫,禮尚往來,遇到你的朋友會給你面子,也希望你遇到我朋友也能給我面子…
或許有人覺得這沒什麼,但對於這我有自己的堅持。

像那種遇到人都不打招呼的,扣分都扣光啦!!

sp_MsForEachTable使用說明

sp_MsForEachTable這指令是微軟沒有記錄在公開文件的預儲程序,在Master資料庫中的系統預儲程序中可以找到這個指令,透過這指令可以輕鬆取得每一資料表的詳細資訊,也可透過這個指令執行資料表的維護作業。

於目前常見SQL Server 版本中,透過下列指令可以取得使用者自訂資料表的相關訊息。

--SQL2000、SQL2005、SQL2008、SQL2008R2適用

EXEC sp_spaceused 'Production.ProductProductPhoto'

GO

 

sp_spaceused-v2008r2.png

如果需要列出資料庫中所有資料表的訊息,就必須於上列指令一一指定每個資料表,而無法在單次查詢中就取得所有訊息,透過sp_MsForEachTable指令可以幫助你將每個資料庫中的資料表的訊息彙總起來。

 

執行sp_MsForEachTable必須提供參數,若未提供錯誤訊息如下所示:

在SQL Server 2000中執行sp_MsForEachTable未提供參數的錯誤訊息

sp_MsForEachTable_error-v2000.png

在SQL Server 2008R2中執行sp_MsForEachTable未提供參數的錯誤訊息

sp_MsForEachTable_error-v2008r2.png

接著借由sp_MsForEachTable指令幫助我們執行指令sp_spaceused,

完整指令如下:

--SQL2000、SQL2005、SQL2008、SQL2008R2適用

EXEC sp_MsForEachTable "Sp_SpaceUsed '?'"

GO

--或

EXEC sp_MsForEachTable "Sp_SpaceUsed [?]"

GO

--或

EXEC sp_MsForEachTable 'EXEC Sp_SpaceUsed [?]'

GO

 

sp_spaceused-AdventureWorks-v2008r2.png

接著我們再來列出單一資料庫內所有資料表資料列筆數

-- SQL2000、SQL2005、SQL2008、SQL2008R2適用

USE AdventureWorks

GO

EXEC sp_MsForEachTable "SELECT '?' AS 'TableName',COUNT(*) AS 'RowCount' FROM ?"

GO

 

顯示每個資料表列數-v2008r2.png

更進階的應用是我們可以把SP_SPACEUSED產生的資料彙總儲存到一個資料表,

範例如下:

USE AdventureWorks

GO

CREATE TABLE #MyTblInfo

(

[name] nvarchar(256),--資料表名稱

[rows] int,--現有資料列數量

[reserved] varchar(18),--資料表磁碟保留空間大小

[reserved_int] int default(0),--資料表磁碟保留空間大小整數值

[data] varchar(18),--資料表實體資料使用磁碟空間大小

[data_int] int default(0),--資料表實體資料使用磁碟空間大小整數值

[index_size] varchar(18),--資料表索引使用磁碟空間大小

[index_size_int] int default(0),--資料表索引使用磁碟空間大小整數值

[unused] varchar(18),--保留給資料表未使用的磁碟空間大小

[unused_int] int default(0)--保留給資料表未使用的磁碟空間大小整數值

)

GO

--將產生的資料寫入暫存資料表#MyTblInfo

EXEC sp_MSforeachtable "INSERT INTO #MyTblInfo ([name],[rows],[reserved],[data],[index_size],[unused]) EXEC sp_spaceused '?'"

GO

--從[reserved]、[data]、[index_size]、[unused]取出數字並更新到對應的整數值欄位

UPDATE #MyTblInfo

SET [reserved_int] = CAST(SUBSTRING([reserved], 1, CHARINDEX(' ', [reserved])) AS int),

[data_int] = CAST(SUBSTRING([data], 1, CHARINDEX(' ', [data])) AS int),

[index_size_int] = CAST(SUBSTRING([index_size], 1, CHARINDEX(' ', [index_size])) AS int),

[unused_int] = CAST(SUBSTRING([unused], 1, CHARINDEX(' ', [unused])) AS int)

GO

--顯示資料

SELECT [name],[rows],[reserved],[reserved_int],

[data],[data_int],[index_size],[index_size_int],

[unused],[unused_int],

CAST(([reserved_int] + [data_int] + [index_size_int] + [unused_int]) /1024.0 AS VARCHAR) + ' MB' AS 'TABLESIZE',

([reserved_int] + [data_int] + [index_size_int] + [unused_int]) /1024.0 AS 'TABLESIZE_FLOAT'

FROM #MyTblInfo

ORDER BY data_int DESC

GO

--//TABLE SIZE

SELECT (CAST(SUM(data_int)/1024.0 AS VARCHAR) + ' MB') AS 'DATA_FILE_SIZE',

(CAST(SUM(index_size_int)/1024.0 AS VARCHAR) + ' MB') AS 'INDEX_FILE_SIZE',

(CAST(SUM(unused_int)/1024.0 AS VARCHAR) + ' MB') AS 'UNUSED_FILE_SIZE',

(CAST((SUM(data_int) + SUM(index_size_int) + SUM(unused_int))/1024.0 AS VARCHAR) + ' MB')AS 'TOTAL_FILE_SIZE'

FROM #MyTblInfo

GO

DROP TABLE #MyTblInfo

GO

 

彙總每個資料表列數-v2008r2.png

參考資料:

SQL Server Undocumented Stored Procedures sp_MSforeachtable and sp_MSforeachdb

By Gregory A. Larsen

http://www.databasejournal.com/features/mssql/article.php/3441031/SQL-Server-Undocumented-Stored-Procedures-spMSforeachtable-and-spMSforeachdb.htm