婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 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傳參介紹的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久精品夜夜夜夜久久| 日韩欧美一区二区不卡| 国产精品综合在线视频| 色哟哟欧美精品| 亚洲精选视频免费看| 亚洲bt欧美bt精品777| 国产精品一品视频| 欧美日韩综合色| 亚洲欧美综合在线精品| 久久福利资源站| 欧美日韩二区三区| 欧美极品少妇xxxxⅹ高跟鞋| 亚洲成人动漫一区| 99久久夜色精品国产网站| 欧美一区二区视频观看视频| 欧美一二三在线| 亚洲免费资源在线播放| 国产精品资源在线| 日韩美女在线视频| 国产午夜精品福利| 日日夜夜一区二区| 精品视频色一区| 亚洲综合色婷婷| 色94色欧美sute亚洲线路二| 日韩制服丝袜av| 色综合天天综合色综合av| 中文字幕av一区二区三区| 亚洲成人在线网站| 欧美丰满嫩嫩电影| 裸体一区二区三区| 欧美精品一区男女天堂| 国产一区二区三区香蕉| 久久久久久久久久久久久久久99 | 国产激情一区二区三区| 精品av久久707| 成人h动漫精品一区二| 亚洲精品久久久蜜桃| 欧美日韩国产综合视频在线观看 | 欧美午夜精品久久久| 欧美日韩精品一区二区在线播放| 久色婷婷小香蕉久久| 国产区在线观看成人精品 | 欧美不卡一区二区三区| 国产很黄免费观看久久| 亚洲日本欧美天堂| 日韩一区二区不卡| 91热门视频在线观看| 日本欧美加勒比视频| 日本一二三不卡| 欧美年轻男男videosbes| 石原莉奈在线亚洲二区| 91国在线观看| 国产999精品久久久久久绿帽| 欧美人动与zoxxxx乱| 欧美午夜视频网站| 在线成人av网站| 欧美电影在线免费观看| 91精品国产美女浴室洗澡无遮挡| 91国模大尺度私拍在线视频| 欧美男人的天堂一二区| 日韩精品一区在线观看| 久久综合五月天婷婷伊人| 国产欧美视频一区二区三区| 国产精品免费久久| 亚洲一区中文在线| 国内成人免费视频| www.爱久久.com| 欧美日韩国产一级二级| 日韩欧美国产电影| 亚洲天堂精品在线观看| 久久精品国产第一区二区三区| 国产麻豆精品久久一二三| 成人开心网精品视频| 欧美一区二区三区在线| 国产精品高潮呻吟| 麻豆成人综合网| 欧美视频中文字幕| 亚洲视频每日更新| 高潮精品一区videoshd| 在线综合视频播放| 亚洲国产一区二区三区青草影视| 成人影视亚洲图片在线| 精品久久国产老人久久综合| 亚洲福利视频一区| 欧美亚一区二区| 亚洲一区二区三区四区五区中文| 麻豆精品视频在线观看免费| 欧美午夜在线一二页| 中文字幕中文乱码欧美一区二区| 一本色道久久综合精品竹菊| 国产日韩欧美a| 国产成人免费9x9x人网站视频| 91精品国产一区二区三区| 亚洲精品乱码久久久久久日本蜜臀| 国产麻豆精品在线| 国产日韩欧美a| 成人看片黄a免费看在线| 中文欧美字幕免费| 成人午夜激情在线| 国产精品无人区| 91色综合久久久久婷婷| 亚洲一区二区三区四区五区黄 | 日本道色综合久久| 国产精品伦理在线| 国产不卡视频在线观看| 久久婷婷国产综合国色天香 | 一本一道久久a久久精品综合蜜臀| 国产精品日产欧美久久久久| 波多野结衣在线一区| 国产精品乱人伦一区二区| 9色porny自拍视频一区二区| 亚洲va欧美va国产va天堂影院| 88在线观看91蜜桃国自产| 精品一二三四区| 亚洲欧美一区二区三区极速播放 | 午夜精品在线视频一区| 久久久亚洲午夜电影| 日本乱人伦一区| 91啪九色porn原创视频在线观看| 亚洲成精国产精品女| 国产亚洲人成网站| 欧美www视频| 欧美一区二区视频网站| 色诱视频网站一区| 成人免费看片app下载| 国产精品自在在线| 精品一区二区影视| 久久不见久久见免费视频1| 日本中文字幕一区二区视频| 欧美日韩在线免费视频| 成人午夜视频福利| 久久99国产精品免费网站| 亚洲综合一二三区| 最新国产成人在线观看| 国产欧美综合在线观看第十页| 亚洲精品在线免费播放| 欧美成人乱码一区二区三区| 欧美妇女性影城| 日韩欧美国产成人一区二区| 欧美电影免费观看高清完整版在线观看| 欧美伦理视频网站| 7777精品伊人久久久大香线蕉超级流畅| 色婷婷精品大视频在线蜜桃视频| 色久综合一二码| 日韩小视频在线观看专区| 久久蜜桃香蕉精品一区二区三区| 国产亚洲精品中文字幕| 中文字幕一区二区三区蜜月| 亚洲天堂免费在线观看视频| 亚洲1区2区3区4区| 国产美女av一区二区三区| 粗大黑人巨茎大战欧美成人| 91视频在线看| 精品国产91洋老外米糕| 亚洲精品乱码久久久久久黑人| 另类成人小视频在线| 99国产精品久久久久| 一区二区三区蜜桃| 日本视频中文字幕一区二区三区| 国产一区二区三区在线观看免费| 国产一区视频网站| 欧美三级一区二区| 国产清纯美女被跳蛋高潮一区二区久久w| 国产精品女同一区二区三区| 婷婷综合五月天| 欧美日韩一区中文字幕| 亚洲国产精品精华液2区45| 美女久久久精品| 91精品久久久久久蜜臀| 一区二区三区毛片| 99精品黄色片免费大全| 国产人成亚洲第一网站在线播放 | 国产精品你懂的在线欣赏| 日韩高清不卡一区二区| 在线观看一区二区视频| 日韩美女精品在线| 色婷婷精品大在线视频| 亚洲色图欧美在线| 丁香五精品蜜臀久久久久99网站| 久久综合999| 丁香婷婷综合网| 亚洲精品五月天| 欧美亚洲动漫精品| 午夜视频在线观看一区| 亚洲激情校园春色| 成人午夜激情视频| 亚洲美女精品一区| 在线电影院国产精品| 捆绑调教一区二区三区| 国产三级一区二区三区| 99精品欧美一区二区三区小说 | 亚洲激情av在线| 欧美性猛交xxxx黑人交| 免费久久99精品国产| 2021国产精品久久精品| www.日韩大片| 蜜臀99久久精品久久久久久软件| 日本一区二区免费在线 | 天天做天天摸天天爽国产一区| 欧美日韩二区三区|