作者meteor007 (meteor007)
看板Database
标题Re: [讨论] 请问当传入SP的某个参数"数量"不固定时
时间Sun Jun 4 14:54:17 2017
Hi,分享一下我最新的做法,
避免以後的人看到我的原文的留言被误导XD
(结果是对的,但作法太烂)
前情提要:
假设有一个表格如下(tbPeopleInfo)
Name Age Gender
1 Alex 30 Male
2 Ben 25 Female
3 Clark 24 Male
4 Dean 50 Female
5 Erik 73 Female
User希望可以多选,有时选Alex,有时选Alex跟Erik,有时选Clark跟Erik
并回传被选中的人的姓名、年龄、性别等资料
---------------------------------------------------
***方法1. 使用Table Variable (这是我推文提到的方法的改良版)
Step A. Create 一个 Table Variable
Step B. Create 一个 Stored Procedure并传入此Table Variable
Step C. 将此Tale Variable和资料表格做Join
---------------------------------------------------
***方法2. 动态组SQL (我是在ASP.NET组动态语句)
using (SqlConnection con = new SqlConnection(connectionstring))
{
SqlCommand command = new SqlCommand();
command.Connection = con;
StringBuilder dySQL = new StringBuilder("Select * from tbPeopleInfo");
dySQL.Append(" where 1 = 1 ");
dySQL.Append(" and Name = 'Alex'");
dySQL.Append(" or Name = 'Ben'");
command.CommandText = dySQL.ToString();
con.Open();
SqlDataReader reader = command.ExecuteReader();
GridView1.DataSource = reader;
GridView1.DataBind();
}
(应该也可以在SP中组,但是我还不会= =)
---------------------------------------------------
***方法3. 动点手脚组input 并使用IN (这是我最後使用的做法)
Step A. 将Input组成 'Alex,Ben' (用逗号隔开人名)
Step B. 建立一个可以Split 逗号 的Function,此Function回传Table
(SQL Server 2016之後内建Split,我使用2012所以才要自己写)
Step C. where Clause 使用 IN
在SSMS中只有简单四行
Declare @Input nvarchar(max)
Set @Input = 'Alex,Mango,Clark,Guava'
Select Name, Age, Gender from tbPeopleInfo
where Name in (SELECT * FROM dbo.SplitString(@Input, ','))
前两行就是Stap A
後两行使用IN
完成!!
基本上,整个方法3.可在此网页找到,整个Credit都是他的!!
http://bit.ly/2qMBh4r
也感谢某个来信跟我讨论的前辈~
虽然我最後没有用你的方法,不过也是学到不少!!
也分享给需要的人
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 172.218.191.30
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Database/M.1496559262.A.353.html
※ 编辑: meteor007 (172.218.191.30), 06/04/2017 14:56:12
※ 编辑: meteor007 (172.218.191.30), 06/04/2017 14:57:24
1F:→ tedcat: 。。。原po你既然用方法3 为何不 06/06 16:39
2F:→ tedcat: 在asp.net组好 in('alex','xxxx')就好 06/06 16:40
3F:→ tedcat: 然後用方法2把sql语句换成最後组完语句就好 06/06 16:42
4F:推 streetbad: 推楼上 拆字或是加减乘除等等之类的运算建议前端先处理 06/06 16:59
5F:→ meteor007: 恩,最後我是这样做的没错,这篇只是范例XD 06/06 17:40