복붙노트

[SQL] SQL에서 지능 목록에 문자열 목록을 변환

SQL

SQL에서 지능 목록에 문자열 목록을 변환

나는 내 저장 프로 시저 INT 목록을 통과 할 수없는 것처럼, 나는 다음과 같이했다, INT 값의 목록이 포함되어 내 저장 프로 시저에 NVARCHAR (MAX)가 내 데이터 형식 int이며 내가 문자열의 목록을 비교할으로하지만, 지금은 문제를 얻고있다. 방법은 주변에 있는가하는 나는 동일한 기능을 수행 할 수 있습니까?

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

하지만 statuslist는 어떻게 INT로 변환하지 INT 지금 문자열 값을 포함?

최신 정보:

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

같이     SET FMTONLY OFF;     DECLARE의 @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

그래서 분할 후 나는 그것이 (@list, ',')로 수용되지 않기 때문에 뜯거나 또는 구분 기호를 지정할 수 아니라고 해당 기능을 구현할 때.

또는 ( ','+ @ 목록 + ',').

해결법

  1. ==============================

    1.당신의 저장 프로 시저를 사용하여 XML 매개 변수를 int 목록을 보낼 수 있습니다. 이 방법은 더 이상이 문제를 해결하지 않고는 더 나은 더 깨끗한 솔루션입니다.

    당신의 저장 프로 시저를 사용하여 XML 매개 변수를 int 목록을 보낼 수 있습니다. 이 방법은 더 이상이 문제를 해결하지 않고는 더 나은 더 깨끗한 솔루션입니다.

    이 질문에 봐 : 저장 프로 시저를 파라미터들의 배열을 전달

    또는이 코드 프로젝트를 확인 : http://www.codeproject.com/Articles/20847/Passing-Arrays-in-SQL-Parameters-using-XML-Data-Ty

    당신이 원하는 방식으로 일을 주장하지만 경우이 기능을 사용할 수 있습니다 :

    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
    

    이처럼 전화 :

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

    2.당신도 문자열 목록 작업 할 수 있습니다. 나는 항상한다.

    당신도 문자열 목록 작업 할 수 있습니다. 나는 항상한다.

    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)
    
  3. ==============================

    3.사실, 당신은 테이블 타입 정의 사용자를 작성하여 프로 시저를 INT 값의 목록을 보낼 수 있습니다. 그러나,이 테이블 매개 변수를 채우기 위해 더 많은 작업을 의미한다.

    사실, 당신은 테이블 타입 정의 사용자를 작성하여 프로 시저를 INT 값의 목록을 보낼 수 있습니다. 그러나,이 테이블 매개 변수를 채우기 위해 더 많은 작업을 의미한다.

    귀하의 경우에, 당신은 당신이 이런 식으로 원하는 것을 달성하기 위해 sp_executesql을 저장 프로 시저를 사용할 수 있습니다 :

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

    4.당신은 당신에게 정수 배열을 반환 SQL 함수를 사용하여이 작업을 수행 할 수 있습니다 .. 당신이 @Delimiter 제대로 나중에 처리 할 수있는 저장 프로 시저에 문자열을 분리 전달하면 좋을 것입니다.

    당신은 당신에게 정수 배열을 반환 SQL 함수를 사용하여이 작업을 수행 할 수 있습니다 .. 당신이 @Delimiter 제대로 나중에 처리 할 수있는 저장 프로 시저에 문자열을 분리 전달하면 좋을 것입니다.

    다음과 같은 데이터를 분할하는 하나 개의 함수를 작성

    CREATE FUNCTION [dbo].[SplitValues] (@StringArray NVARCHAR(MAX), @Delimiter NVARCHAR(10)) 
    RETURNS @ResultedValues table 
    (
    ResultValue INT
    ) 
    AS 
    BEGIN       
      DECLARE @Tokens TABLE(Token nvarchar)         
      DECLARE   @String nvarchar
    
      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
    

    그리고 여기 @Delimiter로 다음과 같은, 내가 (,)를 사용하고 그것을 사용

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

    5.여기 수행하는 방법의 예 및 더 많은 정보에 대한 링크입니다

    여기 수행하는 방법의 예 및 더 많은 정보에 대한 링크입니다

    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 ############################
    
  6. ==============================

    6.이 Informix 데이터베이스에 나를 위해 작동합니다 :

    이 Informix 데이터베이스에 나를 위해 작동합니다 :

    DROP FUNCTION rrhh:fnc_StringList_To_Table;
    CREATE FUNCTION rrhh:fnc_StringList_To_Table (pStringList varchar(250))
        RETURNING INT as NUMERO;
    
        /* A esta Funcion le podes pasar una cadena CSV con una lista de numeros
         *      Ejem:  EXECUTE FUNCTION fnc_StringList_To_Table('1,2,3,4');
         * y te devolvera una Tabla con dichos numeros separados uno x fila
         * Autor:  Jhollman Chacon @Cutcsa - 2019 */
    
        DEFINE _STRING VARCHAR(255);
        DEFINE _LEN INT;
        DEFINE _POS INT;
        DEFINE _START INT;
        DEFINE _CHAR VARCHAR(1);
        DEFINE _VAL INT;
    
        LET _STRING = REPLACE(pStringList, ' ', '');
        LET _START = 0;
        LET _POS = 0;
        LET _LEN = LENGTH(_STRING);
    
        FOR _POS = _START TO _LEN
            LET _CHAR = SUBSTRING(pStringList FROM _POS FOR 1);
    
            IF _CHAR <> ',' THEN 
                LET _VAL = _CHAR::INT;
            ELSE 
                LET _VAL = NULL;
            END IF;
    
            IF _VAL IS NOT NULL THEN 
                RETURN _VAL WITH RESUME;
            END IF;
    
        END FOR;
    
    END FUNCTION;
    
    EXECUTE FUNCTION fnc_StringList_To_Table('1,2,3,4');
    SELECT * FROM TABLE (fnc_StringList_To_Table('1,2,3,4'));
    
  7. from https://stackoverflow.com/questions/16663789/converting-string-list-into-int-list-in-sql by cc-by-sa and MIT license