2013-10-17 208 views
1

我想从C#程序中调用SQL Server 2012 Express中的存储过程以将DateTime数据类型插入列(也是日期时间)。将日期时间插入日期时间字段TSQL

出于某种原因,我不断收到有关“通过字符串转换日期和/或时间时会话失败”的错误。

我已经检查了我的SQL服务器的文化设置,它设置为us_english,但日期时间格式是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 is:'+ @ date' does not work while'declare @date datetime ='2013-10-11 11:00:05.000';选择'Date is:'+ convert(nchar(25),@date)'作品。 – Ricardo

+0

谢谢!奇迹般有效! – rdem

+2

此代码正在构建一个字符串(用于动态SQL)。每当sql组合不同的数据类型时,它都会使用数据类型优先级来执行此操作。这里的文档:http://technet.microsoft.com/en-us/library/ms190309.aspx在这种情况下,有一个字符串和一个日期时间。 SQL尝试将字符串转换为日期时间而不是其他方式。 –

相关问题