2011-09-20 4 views
3

날짜에 대해 다중 값 매개 변수를 사용할 수있는 저장 프로 시저를 가져 오려고합니다. 이 SSRS에 있지하지만 난 그것과 같은 방법을 사용하려고 해요 :저장 프로 시저의 다중 값 날짜 매개 변수?

내가 SSRS에 INT와 VARCHAR 필드가이 방법을 사용
ALTER PROCEDURE spSelectPlacementData 
(
    @ClientID   SMALLINT, 
    @SourceFileDates VARCHAR(MAX) 
) 
AS 
BEGIN 
    SELECT (snip) 
    FROM [APS].[dbo].[Account] A 
    WHERE ClientID = @ClientID 
    AND A.[SourceFileDate] IN (SELECT * FROM dbo.Split(@SourceFileDates)) 
END 

다중 값 매개 변수를보고합니다. 내가 완전히 명확한에없는 것 같아

/****** Object: UserDefinedFunction [dbo].[Split] Script Date: 09/20/2011 11:16:13 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [dbo].[Split] 
/* This function is used to split up multi-value parameters */ 
(
@ItemList VARCHAR(MAX), 
@delimiter CHAR(1) 
) 
RETURNS @IDTable TABLE (Item VARCHAR(MAX) collate database_default) 
AS 
BEGIN 
DECLARE @tempItemList VARCHAR(MAX) 
SET @tempItemList = @ItemList 

DECLARE @i INT 
DECLARE @Item VARCHAR(MAX) 

SET @tempItemList = REPLACE (@tempItemList, @delimiter + ' ', @delimiter) 
SET @i = CHARINDEX(@delimiter, @tempItemList) 

WHILE (LEN(@tempItemList) > 0) 
BEGIN 
IF @i = 0 
SET @Item = @tempItemList 
ELSE 
SET @Item = LEFT(@tempItemList, @i - 1) 

INSERT INTO @IDTable(Item) VALUES(@Item) 

IF @i = 0 
SET @tempItemList = '' 
ELSE 
SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i) 

SET @i = CHARINDEX(@delimiter, @tempItemList) 
END 
RETURN 
END 

이 dbo.Split의 I 온라인 잡고 기능을 사용

string sourceFileDates = ""; 

    foreach (DateTime file in job.sourceFiles) 
    { 
     if (file == job.sourceFiles.Last()) 
     { 
      sourceFileDates += "'" + file.ToString("d") + "'"; 
     } 
     else 
     { 
      sourceFileDates += "'" + file.ToString("d") + "', "; 
     } 
    } 

    selectRunCommand = new SqlCommand("spSelectPlacementData", sqlConnection); 
    selectRunCommand.CommandType = CommandType.StoredProcedure; 
    selectRunCommand.Parameters.Add("@ClientID", SqlDbType.SmallInt); 
    selectRunCommand.Parameters["@ClientID"].Value = job.clientID; 
    selectRunCommand.Parameters.Add("@SourceFileDates", SqlDbType.VarChar); 
    selectRunCommand.Parameters["@SourceFileDates"].Value = sourceFileDates; 

: 여기

내가 SourceFileDates을 연결하기 위해 사용하고 코드입니다 SSRS가 비슷한 매개 변수 (코드에서 시도한 유일한 매개 변수) 인 경우와 매개 변수의 서식을 지정하는 방법과 날짜 데이터 형식이 필수 서식에 미치는 영향은 다릅니다. "문자열에서 날짜 및/또는 시간을 변환 할 때 변환이 실패했습니다." 둘 이상의 값을 선택할 때 오류가 발생합니다.

편집 : 요청으로 foreach 루프 출력의 예 :

'2011년 9월 9일', '2011년 8월 19일', '2011년 8월 12일'

+1

foreach 루프 다음에 sourceFileDates의 값을 표시합니다. – Icarus

답변

10

Table-Valued parameter을 사용하지 않는 이유는 무엇입니까?

create type DateTimes as table 
(
    [Value] datetime 
) 

이 그런 다음 저장 프로 시저를 수정 SQL

에 사용자 정의 테이블 형 DateTimes 만들기 :
ALTER PROCEDURE spSelectPlacementData 
(
    @ClientID   SMALLINT, 
    @SourceFileDates DateTimes readonly -- must be readonly 
) 

지금 당신이 읽기 전용 테이블 변수로 @SourceFileDates을 처리 할 수 ​​있습니다.

SqlCommand 매개 변수를 지정하는 경우 테이블 반환 매개 변수는 SqlDbType.Structured으로 지정되고 DataTable 또는 DataRowcollection으로 전달됩니다.

var sourceFileDates = new DataTable(); 
sourceFileDates.Columns.Add("Value", typeof(DateTime)); 
foreach (DateTime file in job.sourceFiles) 
{ 
    sourceFileDates.Rows.Add(file); 
} 
selectRunCommand.Parameters.Add(new SqlParameter { 
    ParameterName = "@SourceFileDates", 
    Value = sourceFileDates, 
    SqlDbType = SqlDbType.Structured // make sure you specify structured 
}); 

이제 모든 것이 좋은 올바르게 입력 ... 그리고 당신은 어떤 문자열을 구문 분석 또는 캐스팅을 할 필요가 없습니다 : 그래서, 당신과 같이 그것을 채울 수 있습니다.

사이드 노트로 StringsIntegers 유형을 생성 할 수도 있습니다. TVP에 푹 빠져서 장소 전체에서 사용할 수 있습니다.

+0

정확히 내가 들었던 것처럼 들리지만, 존재하지 않습니다. 나는 그것을 줄 것이다, 고마워! –

+0

SQL Server 2008 이상에서만 작동합니다. –

+2

아주 좋은 구현과 설명. 내가 가능한 한 빨리 +1 할 것입니다 (오늘 투표에서 제외). –

3

SSRS는 입력을 제어하기 때문에 약간의 속임수를 씁니다 ... SQL 주입 공격에 대해서는 그렇게 걱정하지 않습니다. 저장 프로 시저를 사용하면이 작업이 약간 더 어려워집니다.

<dates> 
    <date>2011-01-23</date> 
    <date>2011-02-24</date> 
</dates> 

을 다음 표에서와 같이이 치료 : 나는 2005 년에 하나의 인수에 여러 값을 보낼 필요로 할 때 나를 위해 잘 작동하고있다 무엇

, 정말 같은 XML 문자열로 보낼 것이다 함수 :

select 
    x.a.value('.', 'datetime') as myDate 
from 
    @XMLArg.nodes('/dates/date') x(a); 

이제 테이블 값으로 데이터를 가져야합니다. (구문이 약간있을 수 있습니다, 이것은 내 머리 꼭대기에 있습니다)

관련 문제