討論區快速選單
知識庫快速選單
軟體開發過程中有哪些資安漏洞? 掌握Salesforce雲端管理秘訣 政府補助!學嵌入式+物聯網
[ 回上頁 ] [ 討論區發言規則 ]
sqlcommand 使用預存程序群組到底怎麼做?
更改我的閱讀文章字型大小
作者 : asupeduer(Asupeduer)
[ 貼文 10 | 人氣 2751 | 評價 0 | 評價/貼文 0 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/2/19 上午 03:20:08
sqlcommand 使用預存程序群組到底怎麼做?


MS Sql server 可以在一個stored proceduer裡面寫多個命令群組。
例如:
Create PROCEDURE MyProc;1
as
    select * from customer
Go

Create PROCEDURE MyProc;2
as
    select * from Order
Go
..........
在每一個stored proceduer命名群組下,我都建立了數十個命令(最多有40-50個),
但是在ADO.NET下,我卻怎樣也叫不出我的MyProc;1 , MyProc;2 ,MyProc;3 , ...... , MyProc;50

請問自家產品怎麼會對自身產品的支援性這麼差,BCB、Delphi都還可以明確的讀取到所有的stored proceduer。難道是我的用法方法錯了嗎?

作者 : light673(吳馨琳) VB.Net頂尖高手貼文超過500則
[ 貼文 603 | 人氣 1480 | 評價 3860 | 評價/貼文 6.4 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/2/19 上午 10:17:32
:::小女子用NorthWind資料的Customers的資料表做測試,預存程序如下:
CREATE PROCEDURE [MyPro;1]
as
    select * from customers
GO

假如沒有加括號時,則預存程序的名稱為MyPro,加了括號才是MyPro;1

VB.net程式如下:
     Dim cn As New SqlConnection("server=db-machine;database=northwind;user id=sa;password=sa")
     Dim cmd As New SqlCommand()
     cmd.CommandType = CommandType.StoredProcedure
     cmd.CommandText = "[MyPro;1]"
     cmd.Connection = cn

     Try
     cn.Open()
     Dim dr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
     Do While dr.Read
     Debug.WriteLine(dr("customerid"))
     Loop
     Catch ex As SqlException
     MessageBox.Show(ex.Message)
     End Try

請問自家產品怎麼會對自身產品的支援性這麼差 <-------下次有問題時,先想想是不是
你自己的程式有問題,而不要馬上怪產品有問題..........一一|||,抱歉嘿..............^^''
作者 : asupeduer(Asupeduer)
[ 貼文 10 | 人氣 2751 | 評價 0 | 評價/貼文 0 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/2/19 下午 03:23:32
謝謝您的回應。
但我說的與您說的根本是兩回事

MyProc;1、MyProc;2、MyProc;3這三個是存在於MyProc裡的Stored Proceduer。
[MyProc;1]、[MyProc;2]、[MyProc;3]這三個是完全不同名稱的Stored Proceduer。

第一個寫法是一個Stored Proceduer,裡面有三個命令。
第二個寫法是三個Stored Proceduer,讀取當然沒問題。

另外在MSSQL的定義,所謂的[MyProc;1],意義是因為裡面有關鍵字或保留字,
但是因為命名時又必須命名為此,所以用[]來將該字標示為一個使用者定義物件。
作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/2/19 下午 05:29:35
那我可否請教一下,你能使用 EXEC 來分別執行指令嗎?

例如你的例子:
Create PROCEDURE MyProc;1
as
    select * from customer
Go

Create PROCEDURE MyProc;2
as
    select * from Order
Go

請問你可以在 Query Analyzer 中以 EXEC 來個別執行指令嗎?
像是 EXEC MyProc;1, EXEC MyProc;2 之類的?

我測試的結果是,可以使用 EXEC MyProc,但無法使用 EXEC MyProc;1 或 EXEC MyProc;2

ADO.NET 在執行的時候就有如使用 EXEC 指令一樣,所以若 EXEC 做不到的,通常在 ADO.NET 應該也做不到 .

你說 "BCB、Delphi都還可以明確的讀取到所有的stored proceduer",是指 "所有" 還是 "個別" ?

若是個別執行,Borland 是怎麼做到的,那你可能要問問他們的開發團隊,或者 ... 你自己搞錯了也說不定,老實說,我也不知道要怎麼執行一個連 SQL Server Query Engine 都無法執行的指令 ...
作者 : asupeduer(Asupeduer)
[ 貼文 10 | 人氣 2751 | 評價 0 | 評價/貼文 0 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/2/19 下午 10:30:30
exec MyProc;1 parameters1,parameters2......

exec MyProc;2 parameters1,parameters2......


我MS SQL 2000 運用Stored Proceduer群組命令功能已經多年。
且用來寫過N個ERP、進銷存等等。
我不知道你怎麼做不出來,且這是MS SQL官方建議的使用Stored Proceduer方法。
作者 : asupeduer(Asupeduer)
[ 貼文 10 | 人氣 2751 | 評價 0 | 評價/貼文 0 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/2/19 下午 10:34:44
ALTER PROCEDURE dbo.ForFormDUse;1
--宣告動態變數資料
@StartDate Datetime,
@EndDate Datetime
AS
Select Count(*) as Counts From Mail_Details
WHERE (dbo.Mail_Details.Products_Kind <= 2) AND
     (dbo.Mail_Details.Mail_method >= 3)
AND (dbo.Mail_Details.MailDate>=@StartDate) AND (dbo.Mail_Details.MailDate<=DateAdd(second,86399,@EndDate))





ALTER PROCEDURE [dbo].ForFormDUse;2
--宣告動態變數資料
@StartDate Datetime,
@EndDate Datetime
AS
Select Count(*) as Counts From Mail_Details
WHERE (dbo.Mail_Details.Products_Kind >=3) AND (dbo.Mail_Details.Products_Kind <=4) AND
     (dbo.Mail_Details.Mail_method >= 3)
AND (dbo.Mail_Details.MailDate>=@StartDate) AND (dbo.Mail_Details.MailDate<=DateAdd(second,86399,@EndDate))
   AND (dbo.Mail_Details.Mail_No=1)




ALTER PROCEDURE [dbo].ForFormDUse;3
--宣告動態變數資料
@StartDate Datetime,
@EndDate Datetime
AS
Select Count(*) as Counts From Mail_Details
WHERE (dbo.Mail_Details.Products_Kind >=3) AND (dbo.Mail_Details.Products_Kind <=4) AND
     (dbo.Mail_Details.Mail_method >= 3)
AND (dbo.Mail_Details.MailDate>=@StartDate) AND (dbo.Mail_Details.MailDate<=DateAdd(second,86399,@EndDate))
   AND (dbo.Mail_Details.Mail_No<>1)


作者 : asupeduer(Asupeduer)
[ 貼文 10 | 人氣 2751 | 評價 0 | 評價/貼文 0 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/2/19 下午 10:37:34
如果ADO.NET無法支援多重預存程序群組,那我敢說,是一個超級大BUG。
因為其他前端Client開發平台,我還沒看過無法存取的。
BCB、Delphi、QT......
作者 : asupeduer(Asupeduer)
[ 貼文 10 | 人氣 2751 | 評價 0 | 評價/貼文 0 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/2/19 下午 11:04:53
如果您不知道您的資料庫內,到底有多少Stored Proceduer,你可以執行下列命令。

--列出某一資料庫內所有Stored Proceduer清單
exec [資料庫名稱]..sp_procedures_rowset;2 NULL

你可以依照我示範的方法,先建立一個多重預存程序群組,然後用這個命令來
查詢自己的資料庫內,有多少預存程序,就可以看到,你建立的多重預存程序群組,
已經分成多個命令MyProc;1、MyProc;2、MyProc;3,列在你剛才執行查詢的
sp_proceduers命令所列出的Stored Proceduer清單中。




可是呢:
ADO.NET卻用了一串又臭又長又錯誤的命令來獲取Stored Proceduer清單。
他的取法卻沒有取到正確的Stored Proceduer清單
SELECT
db_name() AS [Database_Name],
sp.name AS [Name],
ssp.name AS [Schema],
sp.id AS [ID],
CAST(
     CASE WHEN (OBJECTPROPERTY(sp.id, N'IsMSShipped')=1) THEN 1 WHEN 1 = OBJECTPROPERTY(sp.id, N'IsSystemTable') THEN 1 ELSE 0 END
     AS bit) AS [IsSystemObject],
CAST((SELECT TOP 1 encrypted FROM dbo.syscomments p WHERE sp.id = p.id AND p.colid=1 and p.number < 2) AS bit) AS [IsEncrypted]
FROM
dbo.sysobjects AS sp
INNER JOIN sysusers AS ssp ON ssp.uid = sp.uid
WHERE
(sp.xtype = N'P' OR sp.xtype = N'RF')
ORDER BY
[Database_Name] ASC,[Schema] ASC,[Name] ASC



人家Delphi只用一行MS SQL的內建指令來獲取Stored Proceduer清單,ADO.NET卻用錯誤的笨方法又把命令寫的又臭又長,可見 ADO.NET開發團隊還要加油啊。

作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/2/19 下午 11:44:20
如果是這樣,那我可以告訴你一件事 .

Microsoft 已經在 SQL Server 2005 的文件中宣佈未來將不再支援這樣的預存程序分組,這可能對你來說是個睛天霹靂 .

為什麼?問問使用 SQL Server 的人,有多少比例會使用 Grouping 來處理 SP ? 它有出現在文件的部份,也僅止於 CREATE PROCEDURE 和建立預存程序兩篇文章,連 Support 也很少很少出現 Grouping 相關的,這又是為什麼?

再者,如果 Microsoft 什麼都做的好,那其他軟體公司(包括你我)都不用再混了 .

Borland Delphi 或 BCB 可以只用一行指令,但你知道他們花多少指令在存取 SQL 上?

說穿了,他們只做了一件事就可以賺你的錢,那就是:讓你寫的程式少一點,然後讓你有問題只有找他們的份,只因為你完全不知道真正的底層是怎麼運作的,碰到問題就不知道哪裡出問題,接著就是怪 Borland 的產品不好,或是誰的產品不好之類的 .

沒錯,ADO.NET 有些地方的確不夠方便,取出 SQL Server 資料庫物件的功能不足,因為它都在 SQL-DMO (SQL Server Management Object) 中,如果確實環境內有 SQL Server , 用 SQL-DMO 是很好的選擇,若一定要使用 ADO.NET,很抱歉,使用 T-SQL 和系統資料表來存取清單是很正常的事 .

寫出程式不是最後的目標,真正的目標是寫出好的程式,能寫出真正好的程式是要靠自己去了解,而不是老罵誰的產品不好,路不是只有一條 .
作者 : asupeduer(Asupeduer)
[ 貼文 10 | 人氣 2751 | 評價 0 | 評價/貼文 0 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/2/20 上午 10:45:27
>>Microsoft 已經在 SQL Server 2005 的文件中宣佈未來將不再支援這樣的預存程序分組
請問小朱您的資訊來源來自於何處呢?

目前在T-SQL 2005的文件中明確表示有支援Stored Procedure的群組功能:


CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]
    [ { @parameter [ type_schema_name. ] data_type }
     [ VARYING ] [ = default ] [ OUT | OUTPUT ]
    ] [ ,...n ]
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ]
AS { <sql_statement> [;][ ...n ] | <method_specifier> }
[;]
<procedure_option> ::=
    [ ENCRYPTION ]
    [ RECOMPILE ]
    EXECUTE_AS_Clause ]

<sql_statement> ::=
{ [ BEGIN ] statements [ END ] }

<method_specifier> ::=
EXTERNAL NAME assembly_name.class_name.method_name


以上是查詢自T-SQL 2005 Online Help,連結:
http://msdn2.microsoft.com/en-us/library/ms187926.aspx
文件分類
MSDN Library > Enterprise Servers and Development > SQL Server > SQL Server 2005 Documentation > SQL Server 2005 Books Online > SQL Server Language Reference > Transact-SQL Reference > CREATE PROCEDURE (Transact-SQL)


另關於您說有多少比例的人會使用 Grouping 來處理 SP,而事實上,這是因為可能您寫資料庫方面的程式尚且不多,所以未用到這些功能,就像我也一樣,在看到許多奇奇怪怪的網路語法時,也會覺得為何會這樣用,但事實上,這只是程式設計人員在尋求更完美方案時,所投入心力、智慧時所達到的一個目標。

也例如在新的SQL Server 2005所新增的Povit、XQuery這兩個功能,也不知被開發人員罵過幾年,在SQL Server 2005才終於被罵出來的新功能(但是很不幸的,還是有很多功能沒加上去,如MD5),甚至在尚未有這些功能的年代時,有多少開發人員運用自己的心力,來寫extened Procedure或是user-Functions。
Povit是旋轉資料表,在做不確定資料欄數時需要的功能。
XQuery則是XML資料欄位格式的查詢語法。

至於您說如果官方宣布不支援SP的Grouping的功能,那如消息來源正確,我只能說SQL Server在這項功能上,朝著退化的方向走去,因為在各種發展已久的資料庫引擎中,這類功能是已經健全且必備的功能,如Oracle等。

不過這種東西其實就像盲腸一樣,可有可無,但不需要的話,你不會希望挨一刀去把他割掉,然後痛個十幾二十天,我可以更改我的Proc來配合這樣的Bug,但這只是讓人沮喪罷了。而在日後,我要修改一個群組內的數十個Proc,再來手動開啟數十個Proc,完全失去完美的管理功能,就像是開完刀之後的後遺症。

至於您說Borland與ADO.NET在存取上有什麼不同,事實上我們也曾經仔細追蹤過各家開發平台在元件的存取語法有何不同,不過基本上都不會是問題,只是ADO.NET的好處是DateSet的多層次存取架構上略勝一籌,而Borland在多層次的開發上,架構較為差勁。另外以及對網頁支援性的問題,至於您說罵產品不好,我想,以真正一個開發者而言,要能看得出開發平台哪裡好,哪裡不好,哪裡有Bug,才是真正對下一代開發平台有所貢獻,就像是罵了多年才把Povit、XML資料行別以及XQuery罵出來是一樣的道理。

另外再請您說一下,SQL Server 2005是否真的放棄了SP群組的功能,以及消息來源,若是,我也好早日「山不轉路轉」,謝謝。
作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人asupeduer註記此篇回應為最佳解答 2006/2/20 上午 11:18:51

>>>Microsoft 已經在 SQL Server 2005 的文件中宣佈未來將不再支援這樣的預存程序分組
>請問小朱您的資訊來源來自於何處呢?
>...
>以上是查詢自T-SQL 2005 Online Help,連結:
>http://msdn2.microsoft.com/en-us/library/ms187926.aspx

對不起哦,我的論點來源就是和你一樣的位置,看來你也是和某些網友一樣,都只是 "瞄" 一下網頁而已:

;number
....

Note:
This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

>另關於您說有多少比例的人會使用 Grouping 來處理 SP,而事實上,這是因為可能您寫資料庫方面的程式尚且不多,所以未用到這些功能,就像我也一樣,在看到許多奇奇怪怪的網路語法時,也會覺得為何會這樣用,但事實上,這只是程式設計人員在尋求更完美方案時,所投入心力、智慧時所達到的一個目標。

笑話了 ...
那你可以翻翻坊間的書,看看有幾本(幾頁,甚至幾個字)有說到 SP Grouping ?
我不會去大肆宣揚自己寫過多少程式,多少系統,但我寫 SQL 絕對不會比你少 .
但我寧願相信這是個人習慣,每個程設師都有自己的習慣 .
不過至少我知道要怎麼做,而不是老是從 "網路" 學一些奇奇怪怪的東西 .
寫程式又不是只有 "語法" 問題,不要只站在程式設計師角度來看系統 .


>也例如在新的SQL Server 2005所新增的Povit、XQuery這兩個功能,也不知被開發人員罵過幾年,在SQL Server 2005才終於被罵出來的新功能(但是很不幸的,還是有很多功能沒加上去,如MD5),甚至在尚未有這些功能的年代時,有多少開發人員運用自己的心力,來寫extened Procedure或是user-Functions。
>Povit是旋轉資料表,在做不確定資料欄數時需要的功能。
>XQuery則是XML資料欄位格式的查詢語法。

SQL Server 的演進,我不評論,因為因素和考量很多,你也做過系統,你應該很清楚才對不是嗎?

>至於您說如果官方宣布不支援SP的Grouping的功能,那如消息來源正確,我只能說SQL Server在這項功能上,朝著退化的方向走去,因為在各種發展已久的資料庫引擎中,這類功能是已經健全且必備的功能,如Oracle等。

退化?你想太多了 .

>不過這種東西其實就像盲腸一樣,可有可無,但不需要的話,你不會希望挨一刀去把他割掉,然後痛個十幾二十天,我可以更改我的Proc來配合這樣的Bug,但這只是讓人沮喪罷了。而在日後,我要修改一個群組內的數十個Proc,再來手動開啟數十個Proc,完全失去完美的管理功能,就像是開完刀之後的後遺症。

說真的,這個功能哪裡完美?

只是下一句 DROP PROC 就可以把同名稱的 SP 都刪掉,或者是一次可以跑很多指令,但這和 UNION 有什麼兩樣?而且 SP 本身還可以跑其他的 SP,這個功能到底完美在哪裡?我看不出來,也感覺不到 .

我情願用 Name 來管理 SP,至少它的可維護性比這個要來的高,這也是我的習慣 .

這是我最後一次針對這主題回應,以後的我不會再回應了,以免搞成筆戰 .
作者 : asupeduer(Asupeduer)
[ 貼文 10 | 人氣 2751 | 評價 0 | 評價/貼文 0 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/2/21 上午 12:11:01
感謝,或許MS SQL的確有其他的考量而廢棄了這個語法功能,不過我想這功能好用不好用見仁見智吧,也不盡然對某些方面有所助益。也不能說其他文件或支援很少提到的東西就是沒價值,畢竟MS SQL裡面一樣很許多莫名其妙的語法與功能,連看都沒看過,但總不能說這些沒見過的就是沒價值了。

至於他裡面寫的因為某些缺點而決定廢棄的原因,那也只能如此了,畢竟我們只是眾多終端使用者之一罷了,只是依小弟之見,在SQL 2000上能支援的狀況下,在ADO.NET 1.0卻無法支援,這就是一個明顯的Bug了,您說是吧。

不過這也不是什麼大事,只是未來開發時要放棄這個功能罷了。也感謝版主給小弟提醒,讓我能提早避免這個陷阱,避免日後寫了又要改。反正寫程式嘛,何必拘泥小節,寫程式與爬格子也沒什麼不同。呵呵
 板主 : 小朱
 > ADO.NET - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - ADO.NET - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
ADO.NET
1 小朱 1520 
2 識丁 280 
3 吳馨琳 270 
4 小台 180 
5 Snaking 140 
6 mark 140 
7 好說 120 
8 ammon 100 
9 toyboy 70 
10 再見男人 50 
ADO.NET
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.09375