我正在以这种方式从另一个应用程序调用此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
有人可以建议将多个值传递给单个参数的最简单方法是什么。我已经经历了一些现有问题,提到的解决方案似乎非常复杂。
谢谢。
答案 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是整数列,则逗号分隔列表还必须包含有效的整数。