我可以在SQL Server中使用=
,LIKE
和大多数操作员使用的参数轻松创建存储过程。但是当涉及到使用IN
时,我真的不知道该怎么做,而且我找不到一个好的网站来教我。使用IN条件
例
CREATE PROCEDURE TEST
@Ids --- What type should go here?
AS BEGIN
SELECT * FROM TableA WHERE ID IN (@Ids)
END
这是可能的,如果是怎样?
我可以在SQL Server中使用=
,LIKE
和大多数操作员使用的参数轻松创建存储过程。但是当涉及到使用IN
时,我真的不知道该怎么做,而且我找不到一个好的网站来教我。使用IN条件
例
CREATE PROCEDURE TEST
@Ids --- What type should go here?
AS BEGIN
SELECT * FROM TableA WHERE ID IN (@Ids)
END
这是可能的,如果是怎样?
使用SQL Server 2008及更高版本,您可以使用Table Valued Parameters。
您声明了一个表类型,并且可以将其用作可在IN
子句中使用的存储过程的参数(只读)。
对于不同的选项,我建议阅读Erland Sommarskog出色的Arrays and Lists in SQL Server版本的相关文章。
因此,如果我理解正确,除了在SQL2005中使用nvarchar外没有任何其他方法。我试图避免这种情况,但我想我必须忍受它。 –
@David - XML是另一种选择。链接的文章是详尽的 - 它会告诉你所有可能的方法来做到这一点与分析。 – Oded
那么,我最担心的是,我最终可能会创建一个如此大的查询,以至于不适合varcahr大小。但我修改我的查询一点,我相信这不会发生 –
如果你问我在想什么你问,我每天都这样..
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
我已经做到了这一点过去使用的分割功能,我添加到我的模式功能描述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
您正在使用哪种版本的SQL Server? – Oded
对于2005年的这个项目,我也会在某个时候使用2008和2008R2。 –