Conversión de list de cadenas en list int en SQL

Tengo un nvarchar (MAX) en mi procedimiento almacenado que contiene la list de valores int, lo hice así ya que no es posible pasar la list int a mi procedimiento almacenado , pero ahora tengo problemas ya que mi tipo de datos es int y quiero comparar la list de cadenas. ¿Hay una forma de que yo pueda hacer lo mismo?

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

pero la list de estado contiene ahora valores de cadena no int, entonces, ¿cómo convertirlos a INT?

Actualizar:

 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// ) 

COMO SET FMTONLY OFF; DECLARAR @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 ,@xToDate=@ToDate,@xId=@ID,@xList=@List PRINT @sql 

Entonces, cuando implemento esa function que se divide, no puedo especificar el carácter o el delimitador, ya que no lo está aceptando como (@List, ',').

o (',' + @ List + ',').

Es posible enviar una list int a su procedimiento almacenado utilizando parameters XML. De esta forma ya no tendrá que abordar este problema y será una solución mejor y más limpia.

eche un vistazo a esta pregunta: pasar una matriz de parameters a un procedimiento almacenado

o verifique este proyecto de código: http://www.codeproject.com/Articles/20847/Passing-Arrays-in-SQL-Parameters-using-XML-Data-Ty

Sin embargo, si insiste en hacerlo a su manera, podría usar esta function:

 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 

Llámalo así:

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

Puedes trabajar con la list de strings también. Siempre hago.

 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) 

En realidad, puede enviar la list de valores int a su procedimiento creando un User Defined Table Type . Sin embargo, esto implica más trabajo para llenar el parámetro de la tabla.

En su caso, puede usar el sp_executesql almacenado para lograr lo que desea de esta manera:

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

aquí hay un ejemplo de cómo hacerlo y el Enlace para más información

 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 ############################ 

Puedes hacer esto usando la function sql que te devolverá una matriz entera … Sería grandioso si pasas @Delimiter cadena separada a tu procedimiento almacenado que podría procesarse apropiadamente después.

Escriba una function para dividir los datos de la siguiente manera

 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 

Y luego usarlo como sigue, estoy usando (,) como @Delimiter aquí

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