2013-01-11 63 views
0

我可以在SQL Server中使用=LIKE和大多数操作员使用的参数轻松创建存储过程。但是当涉及到使用IN时,我真的不知道该怎么做,而且我找不到一个好的网站来教我。使用IN条件

CREATE PROCEDURE TEST 
    @Ids --- What type should go here? 
    AS BEGIN 
     SELECT * FROM TableA WHERE ID IN (@Ids) 
    END 

这是可能的,如果是怎样?

+0

您正在使用哪种版本的SQL Server? – Oded

+0

对于2005年的这个项目,我也会在某个时候使用2008和2008R2。 –

回答

3

使用SQL Server 2008及更高版本,您可以使用Table Valued Parameters

您声明了一个表类型,并且可以将其用作可在IN子句中使用的存储过程的参数(只读)。

对于不同的选项,我建议阅读Erland Sommarskog出色的Arrays and Lists in SQL Server版本的相关文章。

+0

因此,如果我理解正确,除了在SQL2005中使用nvarchar外没有任何其他方法。我试图避免这种情况,但我想我必须忍受它。 –

+0

@David - XML是另一种选择。链接的文章是详尽的 - 它会告诉你所有可能的方法来做到这一点与分析。 – Oded

+0

那么,我最担心的是,我最终可能会创建一个如此大的查询,以至于不适合varcahr大小。但我修改我的查询一点,我相信这不会发生 –

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 
1

我已经做到了这一点过去使用的分割功能,我添加到我的模式功能描述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