Для этого вы можете использовать функцию Split Table-value:
CREATE FUNCTION [dbo].[Split](@RowData VARCHAR(8000), @SplitOn VARCHAR(5))
RETURNS @RtnValue TABLE
(
Id int identity(1,1),
Data nvarchar(2000)
)
AS
BEGIN
Declare @Cnt int
Set @Cnt = 1
While (Charindex(@SplitOn,@RowData)>0)
Begin
Insert Into @RtnValue (data)
Select
Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))
Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
Set @Cnt = @Cnt + 1
End
Insert Into @RtnValue (data)
Select Data = ltrim(rtrim(@RowData))
Return
END
Затем вы можете использовать его в своей хранимой процедуре, возможно, с другим параметром, указывающим, является ли он диапазоном или списком:
CREATE PROCEDURE dbo.GetHouses(@Zip VARCHAR(8000), @Type INT)
AS
/*
@Type: 1 - List
2 - Range
*/
IF @Type = 1
BEGIN
SELECT *
FROM tbl_houses H
JOIN dbo.Split(@Zip, ',') S
ON H.zip_code = S.Data
END
IF @Type = 2
BEGIN
SELECT *
FROM tbl_houses
WHERE zip_code >= (SELECT Data FROM dbo.Split(@Zip, ',') WHERE Id = 1)
AND zip_code <= (SELECT Data FROM dbo.Split(@Zip, ',') WHERE Id = 2)
END