2011-09-20 18 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 

私はこのアプローチを使用しています。

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; 

を私はオンラインつかんだこのdbo.Split機能を使う::

/****** 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 

私は完全には明らかではないと思うよ。ここ

は私がSourceFileDatesを連結するために使用しているコードです。どのようにパラメータをフォーマットするか、類似のパラメータ(これは私がコードからやってみた唯一のものです)、および日付データ型が必要な書式設定にどのように影響を与えるかは異なります。文字列から日付や時刻を変換すると変換に失敗しました。複数の値を選択するとエラーが発生します。

編集:要求されたように、foreachループの出力例:

'2011年9月9日'、 '2011年8月19日'、 '2011年8月12日'

+1

foreachループの後のsourceFileDatesの値を表示 – Icarus

答えて

10

Table-Valued parameterを使ってみませんか?今、あなたは読み取り専用テーブル変数として@SourceFileDatesを扱うことができ

ALTER PROCEDURE spSelectPlacementData 
(
    @ClientID   SMALLINT, 
    @SourceFileDates DateTimes readonly -- must be readonly 
) 

は、その後、あなたのストアドプロシージャを修正SQL

create type DateTimes as table 
(
    [Value] datetime 
) 

DateTimes、ユーザー定義テーブル型を作成します。

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); 

これで、データをテーブル値にする必要があります。 (構文が少しばかりかもしれませんが、これは私の頭の上から外れています)

関連する問題