存储过程可以具有要在“IN”过程中使用的动态参数吗? 条款?
我想运行这样的查询:
SELECT * FROM Studio WHERE Id IN (134, 144, 132, 138, 7432, 7543, 2566)
但是传递给 IN 子句的 Id 数量仅在运行时确定。
我必须使用动态 SQL 还是可以通过存储过程来完成?
更新: 如果任一选项可用,哪一个更好?
谢谢。
I want to run a query like this:
SELECT * FROM Studio WHERE Id IN (134, 144, 132, 138, 7432, 7543, 2566)
but the amount of Id's passed to the IN clause is only determined at runtime.
Do I have to use dynamic SQL or can this be done with a stored procedure?
UPDATE:
If either option is available, which one is better?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
根据您的 Sql Server 版本,您可以通过两种不同的方式之一执行此操作。
对于 Sql 2000/2005,您可以使用具有分隔 ID 列表的参数(varchar 类型)。 创建一个 UDF 来解析 varchar 并返回包含项目的表。 然后使您的 IN 子句与表相反(即 ...IN (Select ID FROM @ReturnTable))。
下面是 UDF 内容的示例:
http://pietschsoft.com/post /2006/02/03/T-SQL-Parse-a-delimited-string.aspx
对于 Sql 2008,你可以做同样的事情; 然而,您可以直接进入正题并传入 Table 参数,而不是传入 varchar 参数。 IN 子句仍然有一个子查询,但它的工作原理是一样的。 或者,一旦有了表,您就可以对其进行内部联接并避免对 IN 子句的需要。
编辑:添加了用于解析分隔字符串链接的 UDF。
Depending on your version of Sql Server, you can do this one of two different ways.
For Sql 2000/2005, you can use a parameter (type varchar) that has a delimited list of IDs. Create a UDF that would parse the varchar and return a table containing the items. Then make your IN clause go against the table (i.e. ...IN (Select ID FROM @ReturnTable)).
Here's an example of what the contents of the UDF would look like:
http://pietschsoft.com/post/2006/02/03/T-SQL-Parse-a-delimited-string.aspx
For Sql 2008, you can do the same thing; however instead of passing in a varchar parameter you can just cut to the chase and pass in a Table parameter. The IN clause would still have a subquery but it would work all the same. Alternatively, once you have the table you can just do an Inner Join on it and circumvent the need for the IN clause.
EDIT: added UDF for parsing a delimited string link.
此处描述的解决方案:
SQL Server 2005 中的数组和列表
SQL Server MVP Erland Sommarskog 的 SQL 文本
http://www.sommarskog.se/arrays-in-sql-2005.html
Solution described here:
Arrays and Lists in SQL Server 2005
An SQL text by Erland Sommarskog, SQL Server MVP
http://www.sommarskog.se/arrays-in-sql-2005.html
您绝对可以在存储过程中执行此操作。
在存储过程中创建一个临时表,并插入以逗号或任何分隔符分隔的值,然后执行此操作,
然后删除该表。
You can absolutely do this in a stored procedure.
create a temp table inside the stored procedure and insert the values split on the commas or any delimiter then do this
Then delete the table.
这是我自 MSSQL 2000 以来一直在使用的 UDF。我在某处找到了它 - 抱歉,不记得在哪里了。
基本上,您可以对 UDF 进行联接,其中第一个参数是分隔字符串,第二个参数是分隔符。
SELECT t1.somecolumn FROM sometable t1 INNER JOIN dbo.Split(@delimitedVar, ',') t2 ON t1.ID = t2.Element
Here is a UDF that I've been using since MSSQL 2000. I found this somewhere - sorry, can't remember where.
Basically, you can do a join on the UDF, where the first param is the delimited string, and the second param is the delimiter.
SELECT t1.somecolumn FROM sometable t1 INNER JOIN dbo.Split(@delimitedVar, ',') t2 ON t1.ID = t2.Element
在 SQL 2008 中,您可以使用表值参数。
在 SQL 2005 中,您必须使用动态 SQL,除非您希望将列表作为 XML 传递并在过程中使用 XML 处理将 XML 分解回表变量中。
In SQL 2008 you can use a table valued parameter.
In SQL 2005 you must use dynamic SQL unless you want to pass the list as XML and use XML processing in the procedure to shred the XML back into a table variable.
声明一个 @temp 表并将值拆分到其中。 那么你可以
从 Studio 的内部连接中选择 *
@诱惑TB
上 s.ID=tb.ID
declare a @temp table and split the values into it. then you could do
select * from Studio s inner join
@temptable tb
on s.ID=tb.ID