You cannot use INwith cvs string. If you have Sql Server 2008, you can use the table value option (new in SQL Server 2008). Define it by creating the actual table parameter type:
CREATE TYPE IntTableType AS TABLE (ID bigint PRIMARY KEY)
Your procedure will be as follows:
Create Procedure up_TEST
@Ids IntTableType READONLY
AS
SELECT *
from Customer where CustomerId in (SELECT ID FROM @Ids)
RETURN 0
GO
, . " SQL Server 2008 " , SQL Server. PRO CON :
" SQL Server 2005 Beyond, " Erland Sommarskog
split. :
SELECT
*
FROM YourTable y
INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value
TSQL, SQL Server, . , PRO CON .
Numbers Table , Numbers, 1 10000:
SELECT TOP 10000 IDENTITY(int,1,1) AS Number
INTO Numbers
FROM sys.objects s1
CROSS JOIN sys.objects s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)
Numbers , :
CREATE FUNCTION [dbo].[FN_ListToTable]
(
@SplitOn char(1)
,@List varchar(8000)
)
RETURNS TABLE
AS
RETURN
(
SELECT
ListValue
FROM (SELECT
LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue
FROM (
SELECT @SplitOn + @List + @SplitOn AS List2
) AS dt
INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
WHERE SUBSTRING(List2, number, 1) = @SplitOn
) dt2
WHERE ListValue IS NOT NULL AND ListValue!=''
);
GO
CSV :
declare @aaa nvarchar(10)
set @aaa='1,2,3'
Select * from Customer where CustomerId in (SELECT ListValue FROM dbo.FN_ListToTable(',',@aaa))