[SQL] SQL에서 지능 목록에 문자열 목록을 변환
SQLSQL에서 지능 목록에 문자열 목록을 변환
나는 내 저장 프로 시저 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.당신의 저장 프로 시저를 사용하여 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.당신도 문자열 목록 작업 할 수 있습니다. 나는 항상한다.
당신도 문자열 목록 작업 할 수 있습니다. 나는 항상한다.
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.사실, 당신은 테이블 타입 정의 사용자를 작성하여 프로 시저를 INT 값의 목록을 보낼 수 있습니다. 그러나,이 테이블 매개 변수를 채우기 위해 더 많은 작업을 의미한다.
사실, 당신은 테이블 타입 정의 사용자를 작성하여 프로 시저를 INT 값의 목록을 보낼 수 있습니다. 그러나,이 테이블 매개 변수를 채우기 위해 더 많은 작업을 의미한다.
귀하의 경우에, 당신은 당신이 이런 식으로 원하는 것을 달성하기 위해 sp_executesql을 저장 프로 시저를 사용할 수 있습니다 :
declare @statement nvarchar(4000) = '----your query---- where status in (' + @statusList +')' sp_executesql @statement
-
==============================
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.여기 수행하는 방법의 예 및 더 많은 정보에 대한 링크입니다
여기 수행하는 방법의 예 및 더 많은 정보에 대한 링크입니다
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.이 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'));
from https://stackoverflow.com/questions/16663789/converting-string-list-into-int-list-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 엑셀 VBA에서 두 개의 서로 다른 데이터 소스에서 생성 된 두 개의 레코드를 가입 (0) | 2020.05.27 |
---|---|
[SQL] 매개 변수를 사용하여 ASP.NET ODBC 쿼리 (0) | 2020.05.27 |
[SQL] 어떻게 중포 기지 분석 원시 데이터에 세션 및 세션 기간을 계산? (0) | 2020.05.27 |
[SQL] SQL 여러 조건 조항에 LINQ (0) | 2020.05.27 |
[SQL] 스파크에서 쿼리의 실행 시간을 측정하는 방법 (0) | 2020.05.27 |