Come convertire NVARCHAR separati da virgola in record di tabella in SQL Server 2005?

Ho una lista di ID separati da virgola come:

1,17,25,44,46,67,88 

Voglio convertirli in un record di tabella (in una tabella temporanea) come

 #tempTable number_ -------- 1 17 25 44 46 67 88 

È ansible con una funzione , valutata a livello di tabella?

Perché lo voglio? Voglio usare per la clausola INNER JOIN (in stored procedure) con un’altra tabella (s) come come:

 SELECT a,b,c FROM T1 INNER JOIN functionNameWhichReturnsTable ON functionNameWhichReturnsTable.number_ = T1.a 

Non posso usare IN perché userò stored procedure che accettano un parametro di tipo NVARCHAR. Questo parametro fornirà la lista di id.

Grazie

Possibile duplicazione di valori separati da virgola separati e memorizzazione nella tabella in SQL Server .

Si prega di provare uno preciso da Valore delimitato da virgola a tavola :

 CREATE FUNCTION [dbo].[ufn_CSVToTable] ( @StringInput VARCHAR(8000), @Delimiter nvarchar(1)) RETURNS @OutputTable TABLE ( [String] VARCHAR(10) ) AS BEGIN DECLARE @String VARCHAR(10) WHILE LEN(@StringInput) > 0 BEGIN SET @String = LEFT(@StringInput, ISNULL(NULLIF(CHARINDEX(@Delimiter, @StringInput) - 1, -1), LEN(@StringInput))) SET @StringInput = SUBSTRING(@StringInput, ISNULL(NULLIF(CHARINDEX(@Delimiter, @StringInput), 0), LEN(@StringInput)) + 1, LEN(@StringInput)) INSERT INTO @OutputTable ( [String] ) VALUES ( @String ) END RETURN END GO 

Controlla il requisito in altro modo usando XML:

 DECLARE @param NVARCHAR(MAX) SET @param = '1:0,2:1,3:1,4:0' SELECT Split.a.value('.', 'VARCHAR(100)') AS CVS FROM ( SELECT CAST ('' + REPLACE(@param, ',', '') + '' AS XML) AS CVS ) AS A CROSS APPLY CVS.nodes ('/M') AS Split(a) 

Il metodo che ho trovato non ha bisogno di una funzione o di trucchi XML.

Fondamentalmente si trasforma la stringa in una singola istruzione di inserimento per la tabella temporanea.
Che poi può essere utilizzato per ulteriori elaborazioni.

 IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL DROP TABLE #tempTable; CREATE TABLE #tempTable (number int); DECLARE @TEXT varchar(max) = '1,17,25,44,46,67,88'; DECLARE @InsertStatement varchar(max) = 'insert into #tempTable values ('+REPLACE(@TEXT,',','),(')+');'; EXEC (@InsertStatement); SELECT * FROM #tempTable; 

Questo metodo è utilizzabile per un massimo di 1000 valori.
Perché 1000 è il limite massimo di un’espressione del valore di riga.
O fino al raggiungimento del limite del varchar per @InsertStatement.

Inoltre, come ha sottolineato Stuart Ainsworth.
Poiché questo metodo utilizza EXEC, prestare attenzione all’iniezione del codice e non utilizzarlo per le stringhe basate sull’input dell’utente non verificato.

Completando le risposte, potresti anche utilizzare la stringa CSV per archiviare più valori in più colonne:

  --input sql text declare @text_IN varchar(max) ='text1, text1.2, text1.3, 1, 2010-01-01\r\n text2, text2.2, text2.3, 2, 2016-01-01' 

Dividi il file csv in righe:

 declare @temptable table (csvRow varchar(max)) declare @DelimiterInit varchar(4) = '\r\n' declare @Delimiter varchar(1) = '|' declare @idx int declare @slice varchar(max) set @text_IN = REPLACE(@text_IN,@DelimiterInit,@Delimiter) select @idx = 1 if len(@text_IN)<1 or @text_IN is null return while @idx!= 0 begin set @idx = charindex(@Delimiter,@text_IN) if @idx!=0 set @slice = left(@text_IN,@idx - 1) else set @slice = @text_IN if(len(@slice)>0) insert into @temptable(csvRow) values(@slice) set @text_IN = right(@text_IN,len(@text_IN) - @idx) if len(@text_IN) = 0 break end 

Dividi righe in colonne:

 ;WITH XMLTable (xmlTag) AS ( SELECT CONVERT(XML,'' + REPLACE(csvRow,',', '') + '') AS xmlTag FROM @temptable ) SELECT RTRIM(LTRIM(xmlTag.value('/CSV[1]/champ[1]','varchar(max)'))) AS Column1, RTRIM(LTRIM(xmlTag.value('/CSV[1]/champ[2]','varchar(max)'))) AS Column2, RTRIM(LTRIM(xmlTag.value('/CSV[1]/champ[3]','varchar(max)'))) AS Column3, RTRIM(LTRIM(xmlTag.value('/CSV[1]/champ[4]','int'))) AS Column4, RTRIM(LTRIM(xmlTag.value('/CSV[1]/champ[5]','datetime'))) AS Column5 FROM XMLTable 

I seguenti lavori:

 declare @parStoreNo As varchar(8000) = '1,2,3,4' CREATE TABLE #parStoreNo (StoreNo INT)-- drop #parStoreNo declare @temptable VARCHAR(1000) = @parStoreNo declare @SQL VARCHAR(1000) SELECT @SQL = CONVERT(VARCHAR(1000),' select ' + REPLACE(ISNULL(@temptable,' NULL '),',', ' AS Col UNION ALL SELECT ')) INSERT #parStoreNo (StoreNo) EXEC (@SQL)