se non è possibile utilizzare i parametri del valore della tabella, vedere:"Array ed elenchi in SQL Server 2008 con parametri con valori di tabella" di Erland Sommarskog , ci sono molti modi per dividere la stringa in SQL Server. Questo articolo copre i PRO ei CONTRO di quasi tutti i metodi:
Devi creare una funzione di divisione. Ecco come è possibile utilizzare una funzione di divisione:
SELECT
*
FROM YourTable y
INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value
Preferisco l'approccio della tabella dei numeri per dividere una stringa in TSQL ma ci sono molti modi per dividere le stringhe in SQL Server, vedi il link precedente, che spiega i PRO ei CONTRO di ciascuno.
Affinché il metodo della tabella dei numeri funzioni, devi eseguire questa configurazione dell'orario una tantum, che creerà una tabella Numbers
che contiene righe da 1 a 10.000:
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)
Una volta impostata la tabella dei numeri, crea questa funzione di divisione:
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
Ora puoi facilmente dividere una stringa CSV in una tabella e unirti ad essa:
select * from dbo.FN_ListToTable(' ','stack over flow')
USCITA:
ListValue
-------------------
stack
over
flow
(3 row(s) affected)