0

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

例子

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

这可能吗?如果可以,怎么办?

4

3 回答 3

3

在 SQL Server 2008 及更高版本中,您可以使用表值参数

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

对于不同的选项,我建议您阅读Erland Sommarskog 所著的 SQL Server 中优秀数组和列表版本的相关文章。

于 2013-01-11T14:40:03.600 回答
1

我在过去使用添加到我的模式函数中的拆分函数来完成此操作,如此处所述

然后您可以执行以下操作:

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
于 2013-01-11T18:03:42.537 回答
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
于 2013-01-11T17:32:41.673 回答