Sie können nicht verwenden IN
mit einer cvs-Zeichenkette. Wenn Sie Sql Server 2008 haben, können Sie einen Parameter für Tabellenwerte verwenden (neu in SQL Server 2008). Richten Sie ihn ein, indem Sie den aktuellen Tabellenparametertyp erstellen:
CREATE TYPE IntTableType AS TABLE (ID bigint PRIMARY KEY)
Ihr Vorgehen wäre dann wie folgt:
Create Procedure up_TEST
@Ids IntTableType READONLY
AS
SELECT *
from Customer where CustomerId in (SELECT ID FROM @Ids)
RETURN 0
GO
wenn Sie keine Tabellenwertparameter verwenden können, siehe: "Arrays und Listen in SQL Server 2008 mit tabellenwertigen Parametern" von Erland Sommarskog dann gibt es viele Möglichkeiten, eine Zeichenfolge in SQL Server aufzuteilen. Dieser Artikel befasst sich mit den Vor- und Nachteilen so ziemlich jeder Methode:
"Arrays and Lists in SQL Server 2005 and Beyond, When Table Value Parameters Do Not Cut it" von Erland Sommarskog
Sie müssen eine Splitfunktion erstellen. So kann eine Splitfunktion verwendet werden:
SELECT
*
FROM YourTable y
INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value
Ich bevorzuge den Ansatz der Zahlentabelle zum Aufteilen einer Zeichenkette in TSQL aber es gibt zahlreiche Möglichkeiten, Zeichenketten in SQL Server aufzuteilen, siehe den vorherigen Link, der die Vor- und Nachteile der einzelnen Möglichkeiten erläutert.
Damit die Numbers Table-Methode funktioniert, müssen Sie die Tabelle einmalig einrichten, wodurch eine Tabelle erstellt wird Numbers
die Zeilen von 1 bis 10.000 enthält:
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)
Sobald die Tabelle Numbers eingerichtet ist, erstellen Sie diese Splitfunktion:
CREATE FUNCTION [dbo].[FN_ListToTable]
(
@SplitOn char(1) --REQUIRED, the character to split the @List string on
,@List varchar(8000)--REQUIRED, the list to split apart
)
RETURNS TABLE
AS
RETURN
(
----------------
--SINGLE QUERY-- --this will not return empty rows
----------------
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
Sie können die CSV-Zeichenfolge nun einfach aufteilen und in Ihrer Abfrage verwenden:
declare @aaa nvarchar(10)
set @aaa='1,2,3'
Select * from Customer where CustomerId in (SELECT ListValue FROM dbo.FN_ListToTable(',',@aaa))