[SQL] SQL 서버 - 선언 된 변수 절에 [중복]
SQLSQL 서버 - 선언 된 변수 절에 [중복]
나는 다음을 가지고 있다고 가정 해 봅시다 :
DECLARE @ExcludedList VARCHAR(MAX)
SET @ExcludedList = 3 + ', ' + 4 + ' ,' + '22'
SELECT * FROM A WHERE Id NOT IN (@ExcludedList)
오류 : int 데이터 형식에 VARCHAR 값을 ','변환 할 때 변환에 실패했습니다.
오류가하지만 난 그것을 해결하는 방법을 알고하지 않는 이유를 이해 ...
해결법
-
==============================
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.@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.
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.당신은 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.첫째,이 같은 테이블에있는 값의 구분 된 목록을 분할하는 빠른 함수를 만들 :
첫째,이 같은 테이블에있는 값의 구분 된 목록을 분할하는 빠른 함수를 만들 :
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.나는 문제에 생각
나는 문제에 생각
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.이 시도:
이 시도:
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.나는 동적 쿼리없이 할 수있는 다른 해결책이있다. 우리는뿐만 아니라 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/
from https://stackoverflow.com/questions/2944511/sql-server-in-clause-with-a-declared-variable by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 행에 쉼표로 구분 된 열 값을 변환 (0) | 2020.04.04 |
---|---|
[SQL] SQL (ORACLE) : ORDER BY와 LIMIT [중복] (0) | 2020.04.04 |
[SQL] 왜 절 곳에서 함수, 윈도우를하지? (0) | 2020.04.04 |
[SQL] 왜 널은 널 false로 동일하지 않다 (0) | 2020.04.04 |
[SQL] 열에 피벗 행 집계하지 않고 (0) | 2020.04.04 |