我可以在SQL Server中使用=
,LIKE
和大多数运算符使用的参数轻松创建存储过程。但是当谈到使用IN
时,我真的不明白该做什么,而且我找不到一个好的网站来教我。
实施例
CREATE PROCEDURE TEST
@Ids --- What type should go here?
AS BEGIN
SELECT * FROM TableA WHERE ID IN ( @Ids )
END
这是可能的,如果是这样的话怎么样?
答案 0 :(得分:3)
使用SQL Server 2008及更高版本,您可以使用Table Valued Parameters。
您声明了一个表类型,可以将其用作可以在IN
子句中使用的存储过程的参数(只读)。
对于不同的选项,我建议您阅读Erland Sommarskog撰写的优秀Arrays and Lists in SQL Server版本的相关文章。
答案 1 :(得分:1)
我以前使用Split功能完成了这项工作,我将其添加到我所描述的架构函数here
然后您可以执行以下操作:
CREATE PROCEDURE TEST
@Ids --- What type should go here?
AS BEGIN
SELECT * FROM TableA WHERE ID IN ( dbo.Split(@Ids, ',') )
END
请记住,IN函数总是需要一个值表作为结果。 SQL Server足够智能,可以将字符串转换为此表格式,只要它们是在过程中专门编写的。
您的具体示例中的另一个选项可能是使用连接。这将有性能提升,但通常不能满足您需要的真实示例。加入版本将是:
SELECT *
FROM TableA AS ta
INNER JOIN dbo.Split(@Ids, ',') AS ids
ON ta.Id = ids.items
答案 2 :(得分:0)
如果你问我的想法是什么,我每天都这样做..
WITH myData(FileNames)
AS
(
SELECT '0608751970%'
UNION ALL SELECT '1000098846%'
UNION ALL SELECT '1000101277%'
UNION ALL SELECT '1000108488%'
)
SELECT DISTINCT f.*
FROM tblFiles (nolock) f
INNER JOIN myData md
ON b.FileNames LIKE md.FileNames
或者如果您根据另一张表执行此操作:
WITH myData(FileNames)
AS
(
SELECT RTRIM(FileNames) + '%'
FROM tblOldFiles
WHERE Active=1
)
SELECT DISTINCT f.*
FROM tblFiles (nolock) f
INNER JOIN myData md
ON b.FileNames LIKE md.FileNames