欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > SqlServer參數化查詢之where in和like實現之xml和DataTable傳參介紹

SqlServer參數化查詢之where in和like實現之xml和DataTable傳參介紹

熱門標簽:西安青牛防封電銷卡 400電話申請需要開戶費嗎 溫州語音外呼系統代理 重慶防封電銷機器人供應商 山西語音外呼系統價格 北京辦理400電話多少 威海智能語音外呼系統 智能語音外呼系統哪個牌子好 南京電銷外呼系統運營商

方案5 使用xml參數

對sql server xml類型參數不熟悉的童鞋需要先了解下XQuery概念,這里簡單提下XQuery 是用來從 XML 文檔查找和提取元素及屬性的語言,簡單說就是用于查詢xml的語言說到這就會牽著到XPath,其實XPath是XQuery的一個子集,XQuery 1.0 和 XPath 2.0 共享相同的數據模型,并支持相同的函數和運算符,XPath的方法均適用于XQuery,假如您已經學習了 XPath,那么學習 XQuery 也不會有問題。詳見https://www.jb51.net/w3school/xquery/xquery_intro.htm

XQuery概念了解后需要進一步了解下Sql Server對xml的支持函數,主要為query()、nodes()、exist()、value()、modify() ,詳見http://msdn.microsoft.com/zh-cn/library/ms190798.aspx

使用xml方式實現where in時有兩種實現方式,使用value和exist,在這里推薦使用exist方法,msdn是這樣描述的:

D.使用 exist() 方法而不使用 value() 方法
由于性能原因,不在謂詞中使用 value() 方法與關系值進行比較,而改用具有 sql:column() 的 exist()。
http://msdn.microsoft.com/zh-cn/library/ms178030.aspx

使用xml的value方法實現(不推薦)

復制代碼 代碼如下:

DataTable dt = new DataTable();
using (SqlConnection conn = new SqlConnection(connectionString))
{
string xml = @"
root>
UserID>1/UserID>
UserID>2/UserID>
UserID>5/UserID>
/root>";
SqlCommand comm = conn.CreateCommand();
//不推薦使用value方法實現,性能相對exist要低
comm.CommandText = @"select * from Users
where exists
(
select 1 from @xml.nodes('/root/UserID') as T(c)
where T.c.value('text()[1]','int')= Users.UserID
)";

//也可以這樣寫,結果是一樣的
//comm.CommandText = @"select * from Users
// where UserID in
// (
// select T.c.value('text()[1]','int') from @xml.nodes('/root/UserID') as T(c)
// )
comm.Parameters.Add(new SqlParameter("@xml", SqlDbType.Xml) { Value = xml });
using (SqlDataAdapter adapter = new SqlDataAdapter(comm))
{
adapter.SelectCommand = comm;
adapter.Fill(dt);
}
}

使用xml的exist方法實現(推薦)
復制代碼 代碼如下:

DataTable dt = new DataTable();
using (SqlConnection conn = new SqlConnection(connectionString))
{
string xml = @"
root>
UserID>1/UserID>
UserID>2/UserID>
UserID>5/UserID>
/root>";
SqlCommand comm = conn.CreateCommand();

//使用xml的exist方法實現這樣能夠獲得較高的性能
comm.CommandText = @"select * from Users where @xml.exist('/root/UserID[text()=sql:column(""UserID"")]')=1";
comm.Parameters.Add(new SqlParameter("@xml", SqlDbType.Xml) { Value = xml });
using (SqlDataAdapter adapter = new SqlDataAdapter(comm))
{
adapter.SelectCommand = comm;
adapter.Fill(dt);
}
}

列舉下不同xml結構的查詢方法示例,在實際使用中經常因為不同的xml結構經常傷透了腦筋
復制代碼 代碼如下:

DataTable dt = new DataTable();
using (SqlConnection conn = new SqlConnection(connectionString))
{
string xml = @"
root>
User>
UserID>1/UserID>
/User>
User>
UserID>2/UserID>
/User>
User>
UserID>5/UserID>
/User>
/root>";
SqlCommand comm = conn.CreateCommand();

//不推薦使用value方法實現,性能相對exist要低
comm.CommandText = @"select * from Users
where UserID in
(
select T.c.value('UserID[1]','int') from @xml.nodes('/root/User') as T(c)
)";
//也可以這樣寫,結果是一樣的
//comm.CommandText = @"select * from Users
// where exists
// (
// select 1 from @xml.nodes('/root/User') as T(c)
// where T.c.value('UserID[1]','int') = Users.UserID
// )";
comm.Parameters.Add(new SqlParameter("@xml", SqlDbType.Xml) { Value = xml });
using (SqlDataAdapter adapter = new SqlDataAdapter(comm))
{
adapter.SelectCommand = comm;
adapter.Fill(dt);
}
}

復制代碼 代碼如下:

DataTable dt = new DataTable();
using (SqlConnection conn = new SqlConnection(connectionString))
{
string xml = @"
root>
User>
UserID>1/UserID>
/User>
User>
UserID>2/UserID>
/User>
User>
UserID>5/UserID>
/User>
/root>";
SqlCommand comm = conn.CreateCommand();
//使用xml的exist方法實現這樣能夠獲得較高的性能
comm.CommandText = @"select * from Users where @xml.exist('/root/User[UserID=sql:column(""UserID"")]')=1";

comm.Parameters.Add(new SqlParameter("@xml", SqlDbType.Xml) { Value = xml });
using (SqlDataAdapter adapter = new SqlDataAdapter(comm))
{
adapter.SelectCommand = comm;
adapter.Fill(dt);
}
}

使用xml參數時需要注意點:

  1.不同于SQL語句默認不區分大小寫,xml的XQuery表達式是嚴格區分大小寫的,所以書寫時一定注意大小寫問題

  2.使用exist時sql:column() 中的列名須使用雙引號,如sql:column("UserID"),若非要使用單引號需要連續輸入兩個單引號 sql:column(''UserID'')

  3.不管是where in或是其他情況下使用xml查詢時能用exist(看清楚了不是sql里的exists)方法就用exist方法,我們不去刻意追求性能的優化,但能順手為之的話何樂而不為呢。

方案6 使用表值參數(Table-Valued Parameters 簡稱TVP Sql Server2008開始支持)
按照msdn描述TVP參數在數據量小于1000時有著很出色的性能,關于TVP可以參考 http://msdn.microsoft.com/en-us/library/bb510489.aspx

這里主要介紹如何使用TVP實現DataTable集合傳參實現where in
1.使用表值參數,首先在數據庫創建表值函數
create type IntCollectionTVP as Table(ID int)
2.表值函數創建好后進行c#調用,
注意點:
  1.需要SqlParameter中的SqlDbType設置為SqlDbType.Structured然后需要設置TypeName為在數據庫中創建的表值函數名,本示例中為IntCollectionTVP
  2.構造的DataTabel列數必須和表值函數定義的一樣,具體列名隨意,無需和表值函數定義的列名一致,數據類型可以隨意,但還是建議和表值類型定義的保持一致,一來省去隱式類型轉換,二來可以在初始化DataTabel時就將不合法的參數過濾掉
  3.建議定義tvp的時候最好查詢條件里的類型和tvp對應字段類型保持一致,這樣可以避免隱式類型轉換帶來的性能損失

復制代碼 代碼如下:

DataTable resultDt = new DataTable();
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand comm = conn.CreateCommand();
comm.CommandText = @"select * from Users(nolock)
where exists
(
select 1 from @MyTvp tvp
where tvp.ID=Users.UserID
)";
//構造需要傳參的TVP DataTable
DataTable tvpDt = new DataTable();
//為表添加列,列數需要和表值函數IntCollectionTVP保值一致,列名可以不一樣
tvpDt.Columns.Add("myid", typeof(int));
//添加數據
tvpDt.Rows.Add(1);
tvpDt.Rows.Add(2);
tvpDt.Rows.Add(3);
tvpDt.Rows.Add(4);
//這里的TypeName對應我們定義的表值函數名
comm.Parameters.Add(new SqlParameter("@MyTvp", SqlDbType.Structured) { Value = tvpDt, TypeName = "IntCollectionTVP" });
using (SqlDataAdapter adapter = new SqlDataAdapter(comm))
{
adapter.SelectCommand = comm;
adapter.Fill(resultDt);
}
}

總結:
至此,一共總結了6六種where參數化實現,分別如下
1.使用CHARINDEX或like實現where in 參數化
2.使用exec動態執行SQl實現where in 參數化
3.為每一個參數生成一個參數實現where in 參數化
4.使用臨時表實現where in 參數化
5.使用xml參數實現where in 參數化
6.使用表值參數(TVP)實現where in 參數化
其中前4種在Sql Server參數化查詢之where in和like實現詳解 一文中進行了列舉和示例
6種方法,6種思路,
其中方法1 等于完全棄用了索引,若無特殊需要不建議采用,
方法2 本質上合拼SQL沒啥區別與其用方法2自欺其人還不如直接拼接SQL來的實惠
方法3 受參數個數(做多2100個參數)限制,而且若傳的參數過多性能如何有待驗證,可以酌情使用
方法4 示例中采用的臨時表,其實可以換成表變量性能也許會更好些,不過寫法上有些繁瑣,可以具體的封裝成一個函數會好些(推薦)
方法5 使用xml傳參,既然有這種類型說明性能上應該還不錯,其它會比拼接SQL好很多,使用上也還比較方便,不過需要開發人員對xml查詢有一定了解才行(推薦)
方法6 tvp方式sql server2008以后才可以使用,很好很強大,若只為where in 的話可以定義幾個tvp where in問題就很容易解決了,而且是強類型也更容易理解(推薦)
不好去評論具體那種方法最好,還是那句老話合適的最好。

此文章屬懶惰的肥兔原創

您可能感興趣的文章:
  • SQLServer中使用擴展事件獲取Session級別的等待信息及SQLServer 2016中Session級別等待信息的增強
  • sqlserver 模糊查詢常用方法
  • SqlServer使用 case when 解決多條件模糊查詢問題
  • SqlServer中模糊查詢對于特殊字符的處理方法
  • MSSQL Server 查詢優化方法 整理
  • sqlserver 中charindex/patindex/like 的比較
  • SqlServer參數化查詢之where in和like實現詳解
  • SqlServer2016模糊匹配的三種方式及效率問題簡析

標簽:新余 宜春 金昌 濟寧 中衛 黃山 河源 貸款群呼

巨人網絡通訊聲明:本文標題《SqlServer參數化查詢之where in和like實現之xml和DataTable傳參介紹》,本文關鍵詞  SqlServer,參數,化,查詢,之,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SqlServer參數化查詢之where in和like實現之xml和DataTable傳參介紹》相關的同類信息!
  • 本頁收集關于SqlServer參數化查詢之where in和like實現之xml和DataTable傳參介紹的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    国产老头老太做爰视频| 国产精品久久久久久妇女6080| 一级精品视频在线观看宜春院| 国产不卡视频一区| 久久精品三级视频| 精品成人a区在线观看| 日韩不卡手机在线v区| 91亚洲一线产区二线产区| 欧美综合欧美视频| 一区二区三区日韩精品| av在线不卡电影| 一本到高清视频免费精品| 国产精品久久看| 国产不卡一区视频| 2025国产精品自拍| 18成人在线视频| 波多野结衣91| 在线视频中文字幕一区二区| 亚洲特级片在线| 91亚洲永久精品| 在线观看欧美精品| 一区二区三区波多野结衣在线观看| 99re在线精品| 欧美视频精品在线观看| 亚洲福利电影网| 亚洲天堂2024| 欧美成人a∨高清免费观看| 麻豆精品国产传媒mv男同 | 国模大尺度一区二区三区| 精品人伦一区二区| 国产日产精品一区| 成人午夜电影久久影院| 69av.com| 亚洲成a人v欧美综合天堂| 一级黄色片毛片| 欧美精品一区二区三区蜜桃| 国产制服丝袜一区| 538精品在线视频| 亚洲精品日韩专区silk| 国产国语老龄妇女a片| 日韩欧美在线123| 国内精品视频666| 午夜69成人做爰视频| 亚洲综合在线五月| 亚洲第一香蕉网| 国产欧美中文在线| 91视频.com| 欧美一区二区三区免费观看视频| 免费成人美女在线观看| 成年人看的免费视频| 亚洲欧美日韩在线播放| 亚洲欧美日韩偷拍| wwwwxxxxx欧美| av电影在线观看一区| 欧美福利一区二区| 精品一区精品二区高清| 色综合天天狠狠| 日韩高清不卡一区| 日本不卡一二区| 夜夜精品视频一区二区| 久久久久久久久久久久| 亚洲色图视频免费播放| 超碰男人的天堂| 国产精品美女久久久久av爽李琼| 69久久精品无码一区二区| 2欧美一区二区三区在线观看视频| 成人黄色a**站在线观看| 欧美精品在线观看播放| 国产一区二区成人久久免费影院 | 97se亚洲国产综合自在线| 欧美一区二区成人6969| 国产成人在线视频免费播放| 欧美日韩精品一区二区三区蜜桃| 久久er99精品| 欧美在线free| 国产在线乱码一区二区三区| 欧美性感一类影片在线播放| 精品在线你懂的| 欧美偷拍一区二区| 国产麻豆精品一区二区| 欧美日韩国产美| 国产成人精品一区二| 91精品免费在线| caoporen国产精品视频| 日韩女优电影在线观看| av在线免费观看不卡| 国产亚洲成av人在线观看导航| 国产精品一区二区在线免费观看| 欧美激情一区二区三区不卡| 国产十八熟妇av成人一区| 国产精品国产精品国产专区不片| 欧美熟妇一区二区| 亚洲一区二区在线播放相泽| 小泽玛利亚一区| 免费高清视频精品| 欧美日韩五月天| 波多野结衣欧美| 日本一区二区三区久久久久久久久不| 久久精品女同亚洲女同13| 亚洲欧美色图小说| 69夜色精品国产69乱| 蜜臀va亚洲va欧美va天堂| 欧美色综合网站| 99久久精品免费看国产| 国产日韩精品久久久| 久久午夜福利电影| 日韩黄色免费网站| 欧美久久一区二区| 91免费精品国自产拍在线不卡| 欧美极品aⅴ影院| 性猛交娇小69hd| 蜜桃一区二区三区四区| 欧美日本韩国一区二区三区视频| 不卡电影免费在线播放一区| 国产亚洲欧洲一区高清在线观看| 蜜桃传媒一区二区亚洲av| 亚洲成人动漫在线免费观看| 欧美亚洲国产一区二区三区| 不卡的av在线播放| 国产精品免费aⅴ片在线观看| 调教驯服丰满美艳麻麻在线视频 | 一区二区免费在线观看视频| 亚洲精品免费播放| 色哟哟日韩精品| 成人av在线资源网站| 国产精品美女久久久久av爽李琼| 中文字幕美女视频| 国产精品18久久久久久vr| 久久久电影一区二区三区| 免费看91的网站| 国模娜娜一区二区三区| 久久精品无码一区二区三区| 日韩视频在线观看免费视频| 久久精品国产一区二区三| 欧美va亚洲va国产综合| 韩国三级hd中文字幕| 精品写真视频在线观看| 久久精品一区蜜桃臀影院| 日本二区在线观看| 国产一区二区免费看| 国产精品―色哟哟| 四虎影院中文字幕| 成人h动漫精品一区二区| 亚洲免费观看高清| 欧美色视频一区| 大桥未久恸哭の女教师| 日韩高清不卡在线| 亚洲精品一区二区三区福利| 91狠狠综合久久久久久| 国产风韵犹存在线视精品| 国产精品久久777777| 91国偷自产一区二区开放时间 | 国产chinese中国hdxxxx| 无吗不卡中文字幕| 欧美不卡一区二区三区| 东京热无码av男人的天堂| 国产精品一区二区果冻传媒| 国产精品毛片久久久久久| 91成人免费网站| 久久精品女同亚洲女同13| 久久av资源网| 国产精品久久久久久久久免费丝袜| 欧洲生活片亚洲生活在线观看| 深夜视频在线观看| 日韩激情在线观看| 久久久久久久久久久久电影| 婷婷久久综合网| 少妇极品熟妇人妻无码| 奇米在线7777在线精品| 国产欧美一区二区精品忘忧草 | 99国产精品99久久久久久| 亚洲国产精品久久久男人的天堂 | 91精品欧美久久久久久动漫| 日本性高潮视频| 成人sese在线| 日韩电影在线免费观看| 国产午夜亚洲精品午夜鲁丝片 | 国产成人免费在线观看视频| 又黄又爽又色的视频| 久久精品国产网站| 国产精品国产馆在线真实露脸 | 欧美熟妇另类久久久久久多毛| 免费欧美在线视频| 国产精品视频你懂的| 欧美日韩精品欧美日韩精品一 | 日韩中文字幕亚洲一区二区va在线 | 欧美黄色激情视频| 成人精品gif动图一区| 亚洲妇女屁股眼交7| 久久精品欧美日韩精品| 在线亚洲精品福利网址导航| 性欧美精品中出| 91免费版在线| 国内精品国产三级国产a久久| 亚洲一区二区偷拍精品| 国产三级精品在线| 欧美日韩精品高清| 无码人妻精品中文字幕| 国产xxxxxxxxx| av电影在线观看不卡|