2011-06-30 13 views
1

私はSTARTDATEおよびENDDATE日時のパラメータを持っていますが、私は彼らに変換の問題は、2008

An error has occurred during report processing. 
Exception has been thrown by the target of an invocation. 
Conversion failed when converting date and/or time from character string. 

STARTDATEをレポートショーのエラーを日時を指定する際に持ってPARAMTER SQL Serverのレポートを持っている価値6/2011分の22午前12:00:00 C#コードでレポートパラメータとして設定されたときに、私のストアドプロシージャのコードが

create PROCEDURE Price 
@Startdate datetime = null, 
@Enddate datetime = null  
AS  
declare @sql varchar(8000) 
set @sql = 'SELECT CommodityPrice.dtm_Date FROM Commodity 
INNER JOIN CommodityPrice ON Commodity.int_CommodityId = CommodityPrice.int_CommodityId where Commodity.vcr_HSCode is not null ' 

IF (@Startdate <> '') 
BEGIN 
     SET @sql = @sql + ' and CommodityPrice.dtm_Date >= '+ @Startdate 

END 
IF (@Enddate <> '') 
BEGIN 
     SET @sql = @sql + ' and CommodityPrice.dtm_Date <= '+ @Enddate 
END 

set @sql = @sql+ ' order by CommodityPrice.dtm_Date desc' 

exec (@sql) 

でどのように私はこの問題を削除することができますか?私は動的なSQLを作成しているので、私はいくつかの他のparamtersも持っています。

答えて

3

私の助言;入力を連結しない; p(いつでも)。特にsp_ExecuteSQLでは、EXECでパラメータを使用できます。これにより、問合せプランの再利用を可能にするすべての問題が回避されます。

TSQLであってもユーザー入力を連結しないでください。 が絶対ににならない限り、常にパラメータを使用してください。簡単な例として、

(特にパラメータ名が一致する必要はありませんどのように表示する):

declare @a int = 15, @b datetime = GETUTCDATE() 

declare @sql nvarchar(400) = 'select @x, @y' 

exec sp_executeSql @sql, N'@x int, @y datetime', @a, @b 

を私たちは@xとし@aと@bパラメータとして(マッピングに渡しています@ y)を@sqlのSQLに追加し、安全で再利用可能なキャッシュ可能な方法で実行します。

1

あなたは、まずVARCHARに値を変換する必要が

CONVERT(varchar(30), @Enddate, 121) 

を連結する前に、あなたはその中に日時を第二の問題を持っているが、空の文字列にすることはできません:あなたは空の文字列を割り当てた場合、これは01で深夜になり1月19日(ゼロ)

第3の問題は、動的SQLの場合は、テーブルに対する権限を今すぐ付与する必要があることです。これがなければ、呼び出し側はストアドプロシージャに対する権利しか必要としません。

最後に、あなたはまた、「プロジェクトに私のためにどのような作品だ日付パラメータ

tableName.DateInTable> @ReportDateParameter 

arroundのままにすることができます

create PROCEDURE Price 
    @Startdate datetime = null, 
    @Enddate datetime = null  
AS  
SET NOCOUNT ON; 

SET @Startdate = ISNULL(@Startdate, '19000101'); 
SET @Enddate = ISNULL(NULLIF(@Enddate, '19000101'), '99991231'); 

SELECT CommodityPrice.dtm_Date FROM Commodity 
INNER JOIN CommodityPrice ON Commodity.int_CommodityId = CommodityPrice.int_CommodityId where Commodity.vcr_HSCode is not null ' 

and CommodityPrice.dtm_Date >= @Startdate 
and CommodityPrice.dtm_Date <= @Enddate 
order by CommodityPrice.dtm_Date desc 
GO 
+0

空の文字列の問題がある場合は、DateTime値を文字列としてレポートに渡すことをお勧めします。その後、string.Emptyを送信することは可能です。 – Gambrinus

+0

@Gambrinus:そうではありません。文字列と日付時刻を混在させると、DMY、MDYなどのため予期しない変換エラーが発生します。 – gbn

+0

私はint型、varchar型、bit型の7つの他のパラメータを持っているので、動的SQLを使用しています –

0

、動的SQLを必要としません。

申し訳ありません - sqlがリンクされていることが分かりました。したがって、上記の答えに記載されているように、DateParameterを文字列に変換する必要があります。