2016-05-05 11 views
2

.net/C#を使用してWebアプリケーションを開発したいと考えています。私はSQL Serverストアドプロシージャを持っていて、動的な日時パラメータを渡したいと思います。カラムがdatetimeタイプの場合のパラメータとしてのSQL Serverカラム

私はここにexec(@sql)を使用し、私が得るパラメータを指定してストアドプロシージャです:

Error:System.Data.SqlClient.SqlException:
Conversion failed when converting datetime from character string.

私もいくつかの実際の値を渡してみました(下記参照)、また、SQL Serverのデバッグを試みたが、それは動作しません。

誰でもお手伝いできますか?ありがとうございます。

ALTER PROCEDURE [dbo].[production_tb_WorkshopDailyReports_INSERT] 
    @intDepartmentID int, 
    @intReportUserID int, 
    @intProductionLineID int, 
    @intBatchID int, 
    @intVINID int, 
    @columnname nvarchar(255), 
    @dtOnlineTime datetime, 
    @strRemark nvarchar(50), 
    @intCreateUserID int 
AS 
BEGIN 
    declare @column nvarchar(255) 
    declare @sql nvarchar(1000) 
    declare @intID int 

    set @columnname = 'dtOnlineTimeChassis' 
    set @column = @columnname 
    set @intDepartmentID = 1 
    set @intReportUserID = 1 
    set @intProductionLineID = 1 
    set @intBatchID = 1 
    set @intVINID = 1 
    set @dtOnlineTime = '2016-04-26 10:00:00pm' 
    set @strRemark = 'remark information' 
    set @intCreateUserID = 1 
    set @sql = 'Insert Into production_tb_WorkshopDailyReports (intDepartmentID, intReportUserID, intProductionLineID, intBatchID, intVINID,' + @column + ', strRemark, intCreateUserID) values ' + '(' + cast(@intDepartmentID as nvarchar(20)) + ',' + cast(@intReportUserID as nvarchar(20)) + ',' + cast(@intProductionLineID as nvarchar(20)) + ',' + cast(@intBatchID as nvarchar(20)) + ',' + cast(@intVINID as nvarchar(20)) + ',' + @dtOnlineTime + ',' + @strRemark + ',' + cast(@intCreateUserID as nvarchar(20)) + ')' 
     (@intReportUserID as nvarchar(20))+','+cast(@intProductionLineID as nvarchar(20))+','+cast(@intBatchID as nvarchar(20))+','+cast(@intVINID as nvarchar(20))+','+''+','+cast(@intCreateUserID as nvarchar(20))+')' 

    exec(@sql) 
End 
+0

単一の日付を使用せずに 'string'を' datetime'に変換するのに役立つSQL [CONVERT()fucntion](http://www.w3schools.com/sql/func_convert.asp)をお読みください。フォーマット。 – fujiFX

+0

なぜexecを使いたいですか? insert文を直接使うことはできませんか?コンマやすべてを使用してクエリを書式設定することを避けることができます。 –

答えて

0
+ ',''' + convert(varchar(26), @dtOnlineTime, 121) + ''',''' + @strRemark + ''',' + 
  1. 使用文字列に日付値に変換するために変換します。
  2. 日付と文字列の値を引用符で囲みます。
+0

答えにいくつかの説明を追加 – Batanichek

0

私はこのすべてを推測:

set @columnname = 'dtOnlineTimeChassis' 
set @column = @columnname 
set @intDepartmentID = 1 
set @intReportUserID = 1 
set @intProductionLineID = 1 
set @intBatchID = 1 
set @intVINID = 1 
set @dtOnlineTime = '2016-04-26 10:00:00pm' 
set @strRemark = 'remark information' 
set @intCreateUserID = 1 

だけで、他の時間はSPをテストするために@columnname変数に別の何かがあるでしょうです。この文が偽の場合は、動的SQLの代わりに単純なINSERTを使用することをお勧めします。

',' + @dtOnlineTime + ',' + @strRemark + ',' 

これに:この最初変更で

',''' + CONVERT(nvarchar(50),@dtOnlineTime,120)+''',''' + @strRemark + ''',' 

私は120日付のスタイルを使用することをお勧め(詳細は、ODBC標準yyyy-mm-dd hh:mi:ss(24h)MSDNを読んで)、あなたは日時を置く必要がありますいくつかの発言で''に変数と変数。

セカンド削除するか、またはこの一部(set @sql = ...後に次の文字列を)コメント:

Insert Into production_tb_WorkshopDailyReports (intDepartmentID, intReportUserID, intProductionLineID, intBatchID, intVINID,dtOnlineTimeChassis, strRemark, intCreateUserID) values 
(1,1,1,1,1,'2016-04-26 22:00:00','remark information',1) 

はそれを実行してください:PRINT

(@intReportUserID as nvarchar(20))+','+cast(@intProductionLineID as nvarchar(20))+','+cast(@intBatchID as nvarchar(20))+','+cast(@intVINID as nvarchar(20))+','+''+','+cast(@intCreateUserID as nvarchar(20))+')' 

クエリをINGの次のように表示されます。

関連する問題