2012-01-03 2 views
0

IN 문을 실행해야하는 저장 프로 시저가 있습니다. 문자열 (쉼표로 구분 된 정수 목록)을 int로 변환하는 방법을 알고 싶습니다. 이 예에서는 positionID을 변환해야합니다. 도와주세요. 당신은 SQL 서버 2008는 이제 테이블 유형을 지원한다는 사실을 이용할 수SQL Server 저장 프로 시저로 varchar를 int로 변환

Create PROCEDURE [dbo].[spCount] 
    @year varchar(50), 
    @positionID varchar(50) 
AS 
BEGIN 

Select 
    ApplicantID, [Name], PositionID, COUNT(*) AS Votes 
         FROM   dbo.vwLog 
         WHERE Year = @year And PositionID in (@positionID) 
         GROUP BY ApplicantID, [Name], PositionID 
         Order By PositionID, Votes DESC 
END 
+0

동적 SQL을 사용하지 않으면 불가능합니다. MySQL을 사용했다면 find_in_set() 함수를 사용하는 것이 좋을 것이다. 그러나 SQL 서버는 "in"에 전체 csv 문자열을 삽입하고'... IN (1,2,3, ...)'와 같이 일련 번호가 아닌 하나의 엔티티로 취급합니다. –

+2

이 [질문] 참조 (http://stackoverflow.com/questions/3449183/error-using-csv-string-with-in-operator) –

+0

그냥 백만 가지 '쉼표로 구분 된 문자열'함수 중 하나를 사용하여 TVF 및 공동 TVF 출력 –

답변

2

: 감사

여기 내 저장 프로 시저입니다. 테이블 형식을 정의하고 .net 쪽에서 DataTable을 생성하고 저장 프로 시저에 매개 변수로 전달할 수 있습니다. SP 쪽에서 그 매개 변수는 [당신이 만든 태블릿 유형] 유형입니다. 다음은 예제입니다.

TotalPositions = [Some List] //of CSV List 
DataTable Positions = new DataTable(); //Create the Datatype 
Positions.Columns.Add("PositionID", typeof(int)); // 
foreach (string sPos in TotalPositions.Split(',')) 
Positions.Rows.Add(int.Parse(sPos)); 

그런 다음 추가

CREATE TYPE [dbo].[Positions] AS TABLE(
    [Position] int NULL, 
) 
GO 

로하여 저장 프로 시저에서 테이블 유형을 정의 할 필요가 데이터베이스에 저장 프로 시저

SqlParameter Param = new SqlParameter(); 
Param.Value = Positions 
Param.SqlDbType = SqlDbType.Structured; 
Param.ParameterName = @Positions      
command.Parameters.Add(Param); 

에 대한 매개 변수로 포지션을 추가 할 수 있습니다

@MyPositions Positions Readonly 

이제 @MyPositions을 프로 시저의 테이블로 처리하고 비교할 수 있습니다.

+0

2008 년 다른 기계가 있다고 확신합니다. 해결책을 얻을 수 있다면 실행 해 볼 수 있습니다. :) –

+0

예 슈뢰더 나는 잠시 전에 그것을 깨달았습니다. 이제 나는 그것을 대답으로 편집 할 수있다 :)) – Jordan

2

하는가에 목록이 당신이 통과 쉼표로 구분 될 필요가 있음을 결합? XML은 2005 년 이후에도 작동합니다.

DECLARE @productIds xml 
SET @productIds ='<Positions><id>3</id><id>6</id><id>15</id></Positions>' 

DECLARE @Positions TABLE (ID int) 

INSERT INTO @Positions (ID) SELECT ParamValues.ID.value('.','VARCHAR(20)') 
FROM @productIds.nodes('/Positions/id') as ParamValues(ID) 


SELECT * FROM 
    dbo.vwLog L 
INNER JOIN 
    @Positions p 
ON p.ID = L.PositionID 
관련 문제