使用IN条件

时间:2013-01-11 14:37:51

标签: sql-server tsql sql-server-2005 stored-procedures

我可以在SQL Server中使用=LIKE和大多数运算符使用的参数轻松创建存储过程。但是当谈到使用IN时,我真的不明白该做什么,而且我找不到一个好的网站来教我。

实施例

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

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

3 个答案:

答案 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