복붙노트

[SQL] SQL 서버 - 선언 된 변수 절에 [중복]

SQL

SQL 서버 - 선언 된 변수 절에 [중복]

나는 다음을 가지고 있다고 가정 해 봅시다 :

DECLARE @ExcludedList VARCHAR(MAX)

SET @ExcludedList = 3 + ', ' + 4 + ' ,' + '22'

SELECT * FROM A WHERE Id NOT IN (@ExcludedList)

오류 : int 데이터 형식에 VARCHAR 값을 ','변환 할 때 변환에 실패했습니다.

오류가하지만 난 그것을 해결하는 방법을 알고하지 않는 이유를 이해 ...

해결법

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

    1.당신은 같은 동적 특검팀으로 이것을 실행해야

    당신은 같은 동적 특검팀으로 이것을 실행해야

    DECLARE @ExcludedList VARCHAR(MAX)
    
    SET @ExcludedList = '3,4,22,6014'
    declare @sql nvarchar(Max)
    
    Set @sql='SELECT * FROM [A] WHERE Id NOT IN ('+@ExcludedList+')'
    
    exec sp_executesql @sql
    
  2. ==============================

    2.@your_list, Your_table 실제 물건 값을 교체합니다.

    @your_list, Your_table 실제 물건 값을 교체합니다.

    DECLARE @your_list TABLE (list varchar(25)) 
    INSERT into @your_list
    VALUES ('value1'),('value2376')
    
    SELECT *  
    FROM your_table 
    WHERE your_column in ( select list from @your_list )
    

    SELECT 문에 abowe는 동일로 할 것입니다 :

    SELECT *  
    FROM your_table 
    WHERE your_column in ('value','value2376' )
    
  3. ==============================

    3.

    DECLARE @IDQuery VARCHAR(MAX)
    SET @IDQuery = 'SELECT ID FROM SomeTable WHERE Condition=Something'
    DECLARE @ExcludedList TABLE(ID VARCHAR(MAX))
    INSERT INTO @ExcludedList EXEC(@IDQuery)    
    SELECT * FROM A WHERE Id NOT IN (@ExcludedList)
    

    나는 이전 게시물에 응답하고있어 알고 있지만 나는 하나가 동적 SQL을 사용하지 않도록하고자 할 때 변수 테이블을 사용하는 방법의 예를 공유하기를 원해요. 동적 SQL이 옵션을 선택하지 때의 가장 효율적인 방법은, 그러나이 나를 위해 과거에 근무하고 있는지 확실하지 않습니다.

  4. ==============================

    4.당신은 IN 절에서 변수를 사용할 수 없습니다 - 당신은 동적 SQL을 사용하거나 테이블에 값 목록을 변환하는 기능 (TSQL 또는 CLR)를 사용합니다.

    당신은 IN 절에서 변수를 사용할 수 없습니다 - 당신은 동적 SQL을 사용하거나 테이블에 값 목록을 변환하는 기능 (TSQL 또는 CLR)를 사용합니다.

    동적 SQL의 예 :

    DECLARE @ExcludedList VARCHAR(MAX)
        SET @ExcludedList = 3 + ',' + 4 + ',' + '22'
    
    DECLARE @SQL NVARCHAR(4000)
        SET @SQL = 'SELECT * FROM A WHERE Id NOT IN (@ExcludedList) '
    
     BEGIN
    
       EXEC sp_executesql @SQL '@ExcludedList VARCHAR(MAX)' @ExcludedList
    
     END
    
  5. ==============================

    5.첫째,이 같은 테이블에있는 값의 구분 된 목록을 분할하는 빠른 함수를 만들 :

    첫째,이 같은 테이블에있는 값의 구분 된 목록을 분할하는 빠른 함수를 만들 :

    CREATE FUNCTION dbo.udf_SplitVariable
    (
        @List varchar(8000),
        @SplitOn varchar(5) = ','
    )
    
    RETURNS @RtnValue TABLE
    (
        Id INT IDENTITY(1,1),
        Value VARCHAR(8000)
    )
    
    AS
    BEGIN
    
    --Account for ticks
    SET @List = (REPLACE(@List, '''', ''))
    
    --Account for 'emptynull'
    IF LTRIM(RTRIM(@List)) = 'emptynull'
    BEGIN
        SET @List = ''
    END
    
    --Loop through all of the items in the string and add records for each item
    WHILE (CHARINDEX(@SplitOn,@List)>0)
    BEGIN
    
        INSERT INTO @RtnValue (value)
        SELECT Value = LTRIM(RTRIM(SUBSTRING(@List, 1, CHARINDEX(@SplitOn, @List)-1)))  
    
        SET @List = SUBSTRING(@List, CHARINDEX(@SplitOn,@List) + LEN(@SplitOn), LEN(@List))
    
    END
    
    INSERT INTO @RtnValue (Value)
    SELECT Value = LTRIM(RTRIM(@List))
    
    RETURN
    
    END 
    

    다음과 같이 함수를 호출 ...

    SELECT * 
    FROM A
    LEFT OUTER JOIN udf_SplitVariable(@ExcludedList, ',') f ON A.Id = f.Value
    WHERE f.Id IS NULL
    

    이것은 우리의 프로젝트에 정말 잘 근무하고있다 ...

    그런 경우 (아니지만 질문) 인 경우 물론, 그 반대도 할 수있다.

    SELECT * 
    FROM A
    INNER JOIN udf_SplitVariable(@ExcludedList, ',') f ON A.Id = f.Value
    

    옵션 다중 선택 매개 변수 목록이 보고서를 처리 할 때 그리고 이것은 정말 유용합니다. 매개 변수가 NULL 인 경우에는 선택된 모든 값을 원하지만 하나 개 이상의 값이있는 경우에는 그 값을 필터링 된 보고서 데이터를합니다. 다음과 같은 SQL을 사용 :

    SELECT * 
    FROM A
    INNER JOIN udf_SplitVariable(@ExcludedList, ',') f ON A.Id = f.Value OR @ExcludeList IS NULL
    

    @ExcludeList는 NULL 값이있는 경우이 방법은, 조인의 OR 절은 스위치가되도록이 값 필터링 해제합니다. 아주 편리합니다 ...

  6. ==============================

    6.나는 문제에 생각

    나는 문제에 생각

    3 + ', ' + 4
    

    로 변경

    '3' + ', ' + '4'
    
    DECLARE @ExcludedList VARCHAR(MAX)
    
    SET @ExcludedList = '3' + ', ' + '4' + ' ,' + '22'
    
    SELECT * FROM A WHERE Id NOT IN (@ExcludedList)
    

    쿼리가 가능하게되어있는 것을 SET @ExcludedListe 등

    어느 한 쪽

    SELECT * FROM A WHERE Id NOT IN ('3', '4', '22')
    

    또는

    SELECT * FROM A WHERE Id NOT IN (3, 4, 22)
    
  7. ==============================

    7.이 시도:

    이 시도:

    CREATE PROCEDURE MyProc @excludedlist integer_list_tbltype READONLY AS
      SELECT * FROM A WHERE ID NOT IN (@excludedlist)
    

    그리고 다음과 같이 호출 :

    DECLARE @ExcludedList integer_list_tbltype
    INSERT @ExcludedList(n) VALUES(3, 4, 22)
    exec MyProc @ExcludedList
    
  8. ==============================

    8.나는 동적 쿼리없이 할 수있는 다른 해결책이있다. 우리는뿐만 아니라 XQuery를의 도움으로 그것을 할 수 있습니다.

    나는 동적 쿼리없이 할 수있는 다른 해결책이있다. 우리는뿐만 아니라 XQuery를의 도움으로 그것을 할 수 있습니다.

        SET @Xml = cast(('<A>'+replace('3,4,22,6014',',' ,'</A><A>')+'</A>') AS XML)
        Select @Xml
    
        SELECT A.value('.', 'varchar(max)') as [Column] FROM @Xml.nodes('A') AS FN(A)
    

    여기에 완벽한 솔루션입니다 : http://raresql.com/2011/12/21/how-to-use-multiple-values-for-in-clause-using-same-parameter-sql-server/

  9. from https://stackoverflow.com/questions/2944511/sql-server-in-clause-with-a-declared-variable by cc-by-sa and MIT license