sqlserver 存儲(chǔ)過(guò)程動(dòng)態(tài)參數(shù)調(diào)用實(shí)現(xiàn)代碼
更新時(shí)間:2011年10月17日 19:00:57 作者:
sqlserver 存儲(chǔ)過(guò)程動(dòng)態(tài)參數(shù)調(diào)用實(shí)現(xiàn)代碼,需要的朋友可以參考下。
只是做筆記,沒(méi)什么??!
--創(chuàng)建測(cè)試表
CREATE TABLE [dbo].[Student](
[ID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Name] [nvarchar](20) NOT NULL DEFAULT (''),
[Age] [int] NOT NULL DEFAULT (0),
[Sex] [bit] NOT NULL DEFAULT (0),
[Address] [nvarchar](200) NOT NULL DEFAULT ('')
)
--比如是一個(gè)查詢存儲(chǔ)過(guò)程
Create PROC GetStudentByType
@type int =0, -- 1根據(jù)id查詢, 2根據(jù)性別查詢
@args XML -- 參數(shù)都寫到這里吧
AS
BEGIN
DECLARE @id INT,@sex BIT
SET @id=@args.value('(args/id)[1]','int') --參數(shù)都可以寫在這里,如果沒(méi)有傳過(guò)來(lái),大不了是null值了,反正也用不到,沒(méi)關(guān)系的
SET @sex =@args.value('(args/sex)[1]','bit')
IF(@type=1)
BEGIN
SELECT * FROM dbo.Student WHERE ID=@id
END
IF(@type=2)
BEGIN
SELECT * FROM dbo.Student WHERE Sex=@sex
END
END
參數(shù)寫xml里感覺(jué)比用字符串要好很多,這樣調(diào)用時(shí)參數(shù)就不好組織了,所以這里要有個(gè)幫助類XmlArgs
public class XmlArgs
{
private string _strArgs = string.Empty;
private bool _isCreate = false;
private Dictionary<string, string> _args;
public string Args
{
get
{
if (!_isCreate)
{
_strArgs = _CreateArgs();
_isCreate = true;
}
return _strArgs;
}
}
public XmlArgs()
{
_args = new Dictionary<string, string>();
}
public void Add(string key, object value)
{
_args.Add(key, value.ToString());
_isCreate = false;
}
public void Remove(string key)
{
_args.Remove(key);
_isCreate = false;
}
public void Clear()
{
_args.Clear();
_isCreate = false;
}
private string _CreateArgs()
{
if (_args.Count == 0)
{
return string.Empty;
}
StringBuilder sb = new StringBuilder();
foreach (string key in _args.Keys)
{
sb.AppendFormat("<{0}>{1}</{0}>", key, _args[key]);
}
return sb.ToString();
}
}
調(diào)用:
private void BindData()
{
XmlArgs args = new XmlArgs();
args.Add("id", 1);
System.Data.DataTable dt = GetStudentByType(1, args);
GridView1.DataShow(dt);
}
private System.Data.DataTable GetStudentByType(int type, XmlArgs args)
{
SqlHelper helper = new SqlHelper();
helper.Params.Add("type", type);
helper.Params.Add("args", args.Args);
System.Data.DataTable dt = helper.RunDataTable("GetStudentByType");
return dt;
}
復(fù)制代碼 代碼如下:
--創(chuàng)建測(cè)試表
CREATE TABLE [dbo].[Student](
[ID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Name] [nvarchar](20) NOT NULL DEFAULT (''),
[Age] [int] NOT NULL DEFAULT (0),
[Sex] [bit] NOT NULL DEFAULT (0),
[Address] [nvarchar](200) NOT NULL DEFAULT ('')
)
--比如是一個(gè)查詢存儲(chǔ)過(guò)程
Create PROC GetStudentByType
@type int =0, -- 1根據(jù)id查詢, 2根據(jù)性別查詢
@args XML -- 參數(shù)都寫到這里吧
AS
BEGIN
DECLARE @id INT,@sex BIT
SET @id=@args.value('(args/id)[1]','int') --參數(shù)都可以寫在這里,如果沒(méi)有傳過(guò)來(lái),大不了是null值了,反正也用不到,沒(méi)關(guān)系的
SET @sex =@args.value('(args/sex)[1]','bit')
IF(@type=1)
BEGIN
SELECT * FROM dbo.Student WHERE ID=@id
END
IF(@type=2)
BEGIN
SELECT * FROM dbo.Student WHERE Sex=@sex
END
END
參數(shù)寫xml里感覺(jué)比用字符串要好很多,這樣調(diào)用時(shí)參數(shù)就不好組織了,所以這里要有個(gè)幫助類XmlArgs
復(fù)制代碼 代碼如下:
public class XmlArgs
{
private string _strArgs = string.Empty;
private bool _isCreate = false;
private Dictionary<string, string> _args;
public string Args
{
get
{
if (!_isCreate)
{
_strArgs = _CreateArgs();
_isCreate = true;
}
return _strArgs;
}
}
public XmlArgs()
{
_args = new Dictionary<string, string>();
}
public void Add(string key, object value)
{
_args.Add(key, value.ToString());
_isCreate = false;
}
public void Remove(string key)
{
_args.Remove(key);
_isCreate = false;
}
public void Clear()
{
_args.Clear();
_isCreate = false;
}
private string _CreateArgs()
{
if (_args.Count == 0)
{
return string.Empty;
}
StringBuilder sb = new StringBuilder();
foreach (string key in _args.Keys)
{
sb.AppendFormat("<{0}>{1}</{0}>", key, _args[key]);
}
return sb.ToString();
}
}
調(diào)用:
復(fù)制代碼 代碼如下:
private void BindData()
{
XmlArgs args = new XmlArgs();
args.Add("id", 1);
System.Data.DataTable dt = GetStudentByType(1, args);
GridView1.DataShow(dt);
}
private System.Data.DataTable GetStudentByType(int type, XmlArgs args)
{
SqlHelper helper = new SqlHelper();
helper.Params.Add("type", type);
helper.Params.Add("args", args.Args);
System.Data.DataTable dt = helper.RunDataTable("GetStudentByType");
return dt;
}
您可能感興趣的文章:
- 用非動(dòng)態(tài)SQL Server SQL語(yǔ)句來(lái)對(duì)動(dòng)態(tài)查詢進(jìn)行執(zhí)行
- SQL SERVER 中構(gòu)建執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法
- 分享一下SQL Server執(zhí)行動(dòng)態(tài)SQL的正確方式
- sql server動(dòng)態(tài)存儲(chǔ)過(guò)程按日期保存數(shù)據(jù)示例
- sqlserver 動(dòng)態(tài)創(chuàng)建臨時(shí)表的語(yǔ)句分享
- asp.net Menu控件+SQLServer實(shí)現(xiàn)動(dòng)態(tài)多級(jí)菜單
- sqlserver 支持定位當(dāng)前頁(yè),自定義排序的分頁(yè)SQL(拒絕動(dòng)態(tài)SQL)
- SQL Server中執(zhí)行動(dòng)態(tài)SQL
相關(guān)文章
SQL server服務(wù)顯示遠(yuǎn)程過(guò)程調(diào)用失敗的解決方法
這篇文章主要為大家介紹了SQL server服務(wù)顯示遠(yuǎn)程過(guò)程調(diào)用失敗的解決方法,還為大家提供了解決SQL SERVER 2008 R2配置管理器出現(xiàn)“遠(yuǎn)程過(guò)程調(diào)用失敗”(0x800706be)錯(cuò)誤提示的方案,感興趣的小伙伴們可以參考一下2016-05-05
Sql學(xué)習(xí)第三天——SQL 關(guān)于with ties介紹
with ties一般是和Top , order by相結(jié)合使用的,會(huì)查詢出最后一條數(shù)據(jù)額外的返回值,接下來(lái)將為大家詳細(xì)介紹下,感興趣的各位可以參考下哈2013-03-03
淺析SQL Server中包含事務(wù)的存儲(chǔ)過(guò)程
數(shù)據(jù)庫(kù)事務(wù)(Database Transaction) ,是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作,要么完整地執(zhí)行,要么完全地不執(zhí)行。那么在存儲(chǔ)過(guò)程里添加事務(wù),則可以保證該事務(wù)里的所有sql代碼要么完全執(zhí)行要么完全不執(zhí)行。2014-08-08
巧妙利用PARTITION分組排名遞增特性解決合并連續(xù)相同數(shù)據(jù)行
這篇文章主要介紹了巧妙利用PARTITION分組排名遞增特性解決合并連續(xù)相同數(shù)據(jù)行,需要的朋友可以參考下2014-08-08
SQL Server2022安裝教程的實(shí)現(xiàn)步驟(圖文教程)
在日常的工作中,sql server作為一款常用的數(shù)據(jù)庫(kù)管理系統(tǒng),安裝與配置就顯得非常重要,本文主要介紹了SQL Server2022安裝教程的實(shí)現(xiàn)步驟,感興趣的可以了解一下2023-09-09
附加到SQL2012的數(shù)據(jù)庫(kù)就不能再附加到低于SQL2012的數(shù)據(jù)庫(kù)版本的解決方法
這篇文章主要介紹了附加到SQL2012的數(shù)據(jù)庫(kù)就不能再附加到低于SQL2012的數(shù)據(jù)庫(kù)版本的解決方法,需要的朋友可以參考下2014-02-02

