尝试在SQL Server 2016中传递逗号分隔的值时出错

时间:2019-02-03 14:14:16

标签: sql sql-server sql-server-2016

我正在以这种方式从另一个应用程序调用此SQL Server存储过程:

EXEC GlobalReminder @documentidnumber = '${@documentidnumber}';

documentidnumber是一个包含逗号分隔值的变量,例如7568, 8990, 5523。看来,以这种格式,我无法将多个值传递给该参数,因此会导致错误。

CREATE PROCEDURE [dbo].[GlobalReminder]
    (@documentidnumber NVARCHAR(MAX))
AS
BEGIN
    SET NOCOUNT ON;

    SELECT SUB, REGION, SORTCODE, CLUSTER 
    FROM TABLE1 ct
    INNER JOIN TABLE2 pl ON ct.TYPE_ID = pl.TYPE_ID
    WHERE DOCUMENT_ID IN (@documentidnumber)
END
GO

有人可以建议将多个值传递给单个参数的最简单方法是什么。我已经经历了一些现有问题,提到的解决方案似乎非常复杂。

谢谢。

2 个答案:

答案 0 :(得分:2)

您可以使用split_string()

WHERE DOCUMENT_ID IN (SELECT s.val FROM SPLIT_STRING(@documentidnumber, ',') s(val))

答案 1 :(得分:2)

正确的解决方案是使用表值参数。但是在SQL Server 2016中,您可以使用STRING_SPLIT函数,可以在存储过程中使用该函数:

CREATE PROCEDURE [dbo].[GlobalReminder] (
    @documentidnumber nvarchar(max)
) AS
BEGIN
    SET NOCOUNT ON;

    SELECT SUB, REGION, SORTCODE, CLUSTER
    FROM TABLE1 ct
    INNER JOIN TABLE2 pl ON ct.TYPE_ID = pl.TYPE_ID
    WHERE DOCUMENT_ID IN (
        SELECT value
        FROM STRING_SPLIT(@documentidnumber, ',')
    )
END

请注意,如果DOCUMENT_ID是整数列,则逗号分隔列表还必须包含有效的整数。