我正在创建一个存储过程,我要将逗号分隔的ID列表作为变量传递给该存储过程。我想将Ids用作select语句,例如:
Create Procedure up_TEST @Ids VARCHAR(MAX) AS SELECT * FROM ATable a WHERE a.Id IN(@Ids)
显然,我得到的错误@Ids是varchar而不是INT,但是如何转换逗号分隔列表?
@Ids
对于这些情况,我使用此表函数,您可以根据需要进行调整:
CREATE FUNCTION dbo.f_params_to_list (@par VARCHAR(500)) returns @result TABLE (value VARCHAR(30)) AS begin DECLARE @TempList table ( value VARCHAR(30) ) DECLARE @Value varchar(30), @Pos int SET @par = LTRIM(RTRIM(@par))+ ',' SET @Pos = CHARINDEX(',', @par, 1) IF REPLACE(@par, ',', '') <> '' BEGIN WHILE @Pos > 0 BEGIN SET @Value = LTRIM(RTRIM(LEFT(@par, @Pos - 1))) IF @Value <> '' BEGIN INSERT INTO @TempList (value) VALUES (@Value) --Use Appropriate conversion END SET @par = RIGHT(@par, LEN(@par) - @Pos) SET @Pos = CHARINDEX(',', @par, 1) END END INSERT @result SELECT value FROM @TempList RETURN END
在您的存储过程中,您将像这样使用它:
Create Procedure up_TEST @Ids VARCHAR(MAX) AS SELECT * FROM ATable a WHERE a.Id IN(SELECT value FROM dbo.f_params_to_list(@Ids))