CREATE PROCEDURE dbo.GetUsersDesc
AS
SELECT userID FROM USERS ORDER BY userid DESC;
GO
using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand("GetUsersDesc", conn) { CommandType = CommandType.StoredProcedure })
{
conn.Open();
using (var dr = cmd.ExecuteReader())
while (dr.Read()) { /* 處理資料 */ }
}
CREATE PROCEDURE dbo.GetCommentsByDateRange
@startDate VARCHAR(16), @endDate VARCHAR(16)
AS
SELECT id FROM table_AX
WHERE commentDateTime > @startDate AND commentDateTime < @endDate
ORDER BY contentownerid DESC;
GO
using (var da = new SqlDataAdapter("GetCommentsByDateRange", conn))
{
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.SelectCommand.Parameters.AddWithValue("@startDate", startDate);
da.SelectCommand.Parameters.AddWithValue("@endDate", endDate);
da.Fill(ds);
}
CREATE PROCEDURE dbo.UpdatePassword
@passWord NVARCHAR(20), @userName NVARCHAR(20)
AS
DECLARE @err INT;
UPDATE WL_user SET password = @passWord WHERE UserName = @userName;
SET @err = @@ERROR;
SELECT @err AS err_code; -- 0 成功,非 0 失敗
GO
int result = (int)cmd.ExecuteScalar(); // 取得 err_code
if (result == 0) { /* 成功 */ }
CREATE PROCEDURE dbo.GetCustomerCount
@customerID INT
AS
IF @customerID = -1
BEGIN
SELECT contentownerid, userCName, COUNT(*) AS cnt
FROM view_usercomment
GROUP BY contentownerid, userCName
ORDER BY contentownerid DESC;
END
ELSE
BEGIN
SELECT contentownerid, userCName, COUNT(*) AS cnt
FROM view_usercomment
WHERE contentownerid = @customerID
GROUP BY contentownerid, userCName
ORDER BY contentownerid DESC;
END
GO
@result INT OUTPUT,搭配 ParameterDirection.Output 取得單值。sp_executesql 參數化動態執行,防注入並重用計畫。VARCHAR(50) 非 VARCHAR)。SET NOCOUNT ON 減少網路封包。sp_executesql 而非 EXEC('sql') 進行動態查詢。sp_recompile 或更新統計資料維持計畫品質。預存程序是資料庫開發的核心技能,熟練掌握參數化、錯誤處理、效能調優,能顯著提升應用系統的穩定度與擴展性。