我可以轻松地在 SQL Server 中使用我使用的参数和大多数运算符创建存储=
过程LIKE
。但是说到使用IN
,我真的不明白该怎么做,也找不到一个好的网站来教我。
例子
CREATE PROCEDURE TEST
@Ids --- What type should go here?
AS BEGIN
SELECT * FROM TableA WHERE ID IN ( @Ids )
END
这可能吗?如果可以,怎么办?
我可以轻松地在 SQL Server 中使用我使用的参数和大多数运算符创建存储=
过程LIKE
。但是说到使用IN
,我真的不明白该怎么做,也找不到一个好的网站来教我。
例子
CREATE PROCEDURE TEST
@Ids --- What type should go here?
AS BEGIN
SELECT * FROM TableA WHERE ID IN ( @Ids )
END
这可能吗?如果可以,怎么办?
在 SQL Server 2008 及更高版本中,您可以使用表值参数。
IN
您声明一个表类型,并且可以将其用作可在子句中使用的存储过程的参数(只读) 。
对于不同的选项,我建议您阅读Erland Sommarskog 所著的 SQL Server 中优秀数组和列表版本的相关文章。
我在过去使用添加到我的模式函数中的拆分函数来完成此操作,如此处所述
然后您可以执行以下操作:
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
如果你问我认为你在问什么,我每天都这样做..
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