Conversione di un elenco di stringhe in un elenco Int in SQL

Ho un nvarchar (MAX) nella mia stored procedure che contiene l’elenco di valori int, l’ho fatto in questo modo in quanto non è ansible passare l’elenco int alla mia stored procedure , ma, ora sto ricevendo problemi come il mio tipo di dati è int e voglio confrontare la lista di stringhe. C’è un modo per poter fare lo stesso?

---myquerry----where status in (@statuslist) 

ma lo statuslist contiene ora i valori stringa non int, quindi come convertirli in INT?

Aggiornare:

 USE [Database] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[SP] ( @FromDate datetime = 0, @ToDate datetime = 0, @ID int=0, @List nvarchar(MAX) //This is the List which has string ids// ) 

COME IMPOSTATO FMTONLY OFF; DICHIARARE @sql nvarchar (MAX), @paramlist nvarchar (MAX)

 SET @sql = 'SELECT ------ and Code in(@xList) and -------------' SELECT @paramlist = '@xFromDate datetime,@xToDate datetime,@xId int,@xList nvarchar(MAX)' EXEC sp_executesql @sql, @paramlist, @xFromDate = @FromDate ,@[email protected],@[email protected],@[email protected] PRINT @sql 

Quindi, quando implemento quella funzione che si divide, non sono in grado di specificare il carattere o il delimitatore poiché non lo accetta come (@List, ‘,’).

o (‘,’ + @ Lista + ‘,’).

È ansible inviare un elenco int alla procedura memorizzata utilizzando i parametri XML. In questo modo non dovrai più affrontare questo problema ed è una soluzione migliore e più pulita.

dare un’occhiata a questa domanda: passare una serie di parametri ad una stored procedure

o controlla questo progetto di codice: http://www.codeproject.com/Articles/20847/Passing-Arrays-in-SQL-Parameters-using-XML-Data-Ty

Tuttavia, se insisti a farlo a modo tuo, potresti usare questa funzione:

 CREATE FUNCTION [dbo].[fnStringList2Table] ( @List varchar(MAX) ) RETURNS @ParsedList table ( item int ) AS BEGIN DECLARE @item varchar(800), @Pos int SET @List = LTRIM(RTRIM(@List))+ ',' SET @Pos = CHARINDEX(',', @List, 1) WHILE @Pos > 0 BEGIN SET @item = LTRIM(RTRIM(LEFT(@List, @Pos - 1))) IF @item <> '' BEGIN INSERT INTO @ParsedList (item) VALUES (CAST(@item AS int)) END SET @List = RIGHT(@List, LEN(@List) - @Pos) SET @Pos = CHARINDEX(',', @List, 1) END RETURN END 

Chiamalo così:

 SELECT * FROM Table WHERE status IN (SELECT * from fnStringList2Table(@statuslist)) 

Puoi anche lavorare con la lista di stringhe. Lo faccio sempre.

 declare @statuslist nvarchar(max) set @statuslist = '1, 2, 3, 4' declare @sql nvarchar(max) set @sql = 'select * from table where Status in (' + @statuslist + ')' Execute(@sql) 

In realtà, è ansible inviare l’elenco di valori int alla procedura creando un User Defined Table Type . Tuttavia, questo implica più lavoro per popolare il parametro della tabella.

Nel tuo caso, puoi utilizzare la stored procedure sp_executesql per ottenere ciò che desideri in questo modo:

 declare @statement nvarchar(4000) = '----your query---- where status in (' + @statusList +')' sp_executesql @statement 

ecco un esempio di come farlo e il Link per maggiori informazioni

 ALTER FUNCTION iter_intlist_to_tbl (@list nvarchar(MAX)) RETURNS @tbl TABLE (listpos int IDENTITY(1, 1) NOT NULL, number int NOT NULL) AS BEGIN DECLARE @startpos int, @endpos int, @textpos int, @chunklen smallint, @str nvarchar(4000), @tmpstr nvarchar(4000), @leftover nvarchar(4000) SET @textpos = 1 SET @leftover = '' WHILE @textpos <= datalength(@list) / 2 BEGIN SET @chunklen = 4000 - datalength(@leftover) / 2 SET @tmpstr = ltrim(@leftover + substring(@list, @textpos, @chunklen)) SET @textpos = @textpos + @chunklen SET @startpos = 0 SET @endpos = charindex(' ' COLLATE Slovenian_BIN2, @tmpstr) WHILE @endpos > 0 BEGIN SET @str = substring(@tmpstr, @startpos + 1, @endpos - @startpos - 1) IF @str <> '' INSERT @tbl (number) VALUES(convert(int, @str)) SET @startpos = @endpos SET @endpos = charindex(' ' COLLATE Slovenian_BIN2, @tmpstr, @startpos + 1) END SET @leftover = right(@tmpstr, datalength(@tmpstr) / 2 - @startpos) END IF ltrim(rtrim(@leftover)) <> '' INSERT @tbl (number) VALUES(convert(int, @leftover)) RETURN END -- ############################ Example ############################ --CREATE PROCEDURE get_product_names_iter @ids varchar(50) AS --SELECT P.ProductName, P.ProductID --FROM Northwind..Products P --JOIN iter_intlist_to_tbl(@ids) i ON P.ProductID = i.number --go --EXEC get_product_names_iter '9 12 27 37' -- ############################ WICHTIG ############################ 

Puoi farlo usando la funzione sql che ti restituirà un array intero. Sarebbe bello se passassi la stringa separata da @Delimiter alla stored procedure che potrebbe essere elaborata correttamente in seguito.

Scrivi una funzione per dividere i dati come segue

 ALTER FUNCTION [YourSchema].[SplitValues] (@StringArray NVARCHAR(MAX), @Delimiter NVARCHAR(10)) RETURNS @ResultedValues table ( ResultValue INT ) AS BEGIN WHILE (CHARINDEX(@Delimiter,@StringArray)>0) BEGIN INSERT INTO @Tokens (Token) VALUES (LTRIM(RTRIM(SUBSTRING(@StringArray,1,CHARINDEX(@Delimiter,@StringArray)-1)))) SET @String = SUBSTRING(@StringArray, CHARINDEX(@Delimiter,@StringArray)+LEN(@Delimiter),LEN(@StringArray)) END INSERT INTO @ResultedValues (ResultValue ) VALUES ( CAST(LTRIM(RTRIM(@String)) AS INT)) RETURN END 

E poi usalo come segue, sto usando (,) come @Delimiter qui

 SELECT ResultValue [YourSchema].[SplitValues](@statuslist,',')