2013-10-17 2 views
1

C# 프로그램에서 SQL Server 2012 Express의 저장 프로 시저를 호출하여 DateTime 데이터 형식을 열 (datetime 임)에 삽입하려고합니다.datetime 필드에 날짜 시간 삽입 TSQL

어떤 이유에서든 "날짜 및/또는 시간을 문자열로 변환 할 때 대화가 실패했습니다."라는 오류가 계속 발생합니다.

SQL 서버에서 culture 설정을 확인했습니다.이 설정은 us_english로 설정되어 있지만 datetime 형식은 ISO 표준입니다.

다음은 저장 프로 시저의 코드입니다. 값은 C# 응용 프로그램에서 전달한 값과 같습니다.

USE testdb; 
DECLARE @Name NVARCHAR(50) = 'Somename', 
    @Location NVARCHAR(50) = 'somelocation', 
    @Date DateTime = '2013-10-11 11:00:05.000' 

BEGIN 

SET NOCOUNT ON; 

SELECT @Name, @Location, @Date 

if exists (select name from ComputerHistory where name = @Name) 
    begin 
     DECLARE @Query1 NVARCHAR(MAX) 
     if @Location <> 'disconnected' 
      begin 
       set @Query1 = ' 
        update ComputerHistory 
        set ' + @Location + ' = 1 + ISNULL((select MAX(' + @Location + ') from ComputerHistory where name = ''' + @Name + '''),0), 
        lastdateonline = ''' + @Date + ''' 
        where name = ''' + @Name + ''' 
        ' 

       --EXEC sp_executesql @Query1 
      end 
     else 
      begin 
       set @Query1 = ' 
        update ComputerHistory 
        set ' + @Location + ' = 1 + ISNULL((select MAX(' + @Location + ') from ComputerHistory where name = ''' + @Name + '''),0) 
        where name = ''' + @Name + ''' 
        ' 
       EXEC sp_executesql @Query1 
      end 
    end 
else 
    begin 
     DECLARE @Query2 NVARCHAR(150) 
     set @Query2 = 'insert into ComputerHistory(name, ' + @Location + ') VALUES(''' + @Name + ''', ''1'')' 
     EXEC sp_executesql @Query2 
    end 
END 

답변

1

시도 캐스트 (@date은 NVARCHAR (50)로)

   set @Query1 = ' 
       update ComputerHistory 
       set ' + @Location + ' = 1 + ISNULL((select MAX(' + @Location + ') from ComputerHistory where name = ''' + @Name + '''),0), 
       lastdateonline = ''' + cast(@Date as nvarchar(50)) + ''' 
       where name = ''' + @Name + ''' 
       ' 
+0

작동합니다 그. SQL Server가 암시 적 캐스트에서 올바른 유형을 적용하지 않는 것 같습니다. 코드'declare @date datetime = '2013-10-11 11 : 00 : 05.000'; '날짜 선택 :'+ @ date'은'declare @date datetime = '2013-10-11 11 : 00 : 05.000'; '날짜는 :'+ convert (nchar (25), @date)'를 선택하십시오. – Ricardo

+0

감사! 매력처럼 작동합니다! – rdem

+2

이 코드는 문자열을 작성합니다 (동적 SQL의 경우). sql이 다른 데이터 유형을 결합 할 때마다 데이터 유형 우선 순위를 사용합니다. 여기에 문서 : http://technet.microsoft.com/en-us/library/ms190309.aspx이 경우에는 문자열과 datetime이 있습니다. SQL은 문자열을 다른 방법 대신 datetime으로 변환하려고 시도합니다. –