2013-05-09 24 views
1

转换日期时间,当我有这个疑问,以填补在多数民众赞成给我这个错误信息表日期:从字符串转换日期时间时SQL服务器转换失败从字符串

转换失败。

下面是我的表声明和查询。我做错了什么,我该如何解决它?

CREATE TABLE #inv 
(
     Rep_LName NVARCHAR(50) 
    , Rep_FName NVARCHAR(50) 
    , Rep_ID NVARCHAR(50) 
    , Rep_Email NVARCHAR(100) 
    , Rep_Status NVARCHAR(50) 
    , Rep_BU NVARCHAR(50) 
    , Sales_Force NVARCHAR(50) 
    , Territory NVARCHAR(50) 
    , Sample_Eligibility NVARCHAR(50) 
    , DM_Name NVARCHAR(100) 
    , Phys_Inv_Date DATETIME 
    , Last_Reconciled DATETIME 
    , Inv_Type NVARCHAR(50) 
    , Days_Since_Last_inv INT 
) 

我试图填补Phys_Inv_Date场光标里面,像这样:

OPEN Inventory_info 

FETCH NEXT FROM Inventory_info INTO @rep_ID, @call_date 

WHILE (@@fetch_status = 0) BEGIN 

     SELECT 
      @ls_Sql = 'update #inv set Phys_Inv_Date = case when inventory_type = ''physical'' then ' 
      + @call_date 
      + ' else b.inv_date end from #inv a INNER JOIN (select top 1 call_date, rep_id from inv_header where call_date < ' 
      + @call_date + ' and rep_id = ''' + @rep_id 
      + ''') b ON a.rep_id = b.rep_id WHERE Phys_Inv_Date IS NULL' 

     EXEC (@ls_Sql) 

     FETCH NEXT FROM Inventory_info INTO @rep_ID, @call_date 

END 

CLOSE Inventory_info 
DEALLOCATE Inventory_info 
+2

什么是“字符串”您要转换为一个约会?换句话说,@call_date的价值是什么? – 2013-05-09 19:48:11

+3

你为什么在这里使用动态SQL?看起来您可以使用带参数的常规SQL,那么您不必担心格式化“datetime”值。 – Pondlife 2013-05-09 19:58:24

回答

4

使用带参数的SQL有什么问题?还有就是为什么你需要在这里的动态SQL没有明显的理由,并假设变量是正确的数据类型,那么你就不需要任何转换:

update 
    #inv 
set 
    Phys_Inv_Date = case 
     when inventory_type = 'physical' then @call_date 
     else b.inv_date end 
from 
    #inv a 
    INNER JOIN (
     select top 1 
      call_date, 
      rep_id 
     from 
      inv_header where call_date < @call_date 
      and rep_id = @rep_id 
    ) b 
    ON a.rep_id = b.rep_id 
WHERE 
    Phys_Inv_Date IS NULL 
+0

我最终做了类似的事情。谢谢你的帮助! – Javi 2013-05-09 20:43:33

0

假设在inventory_infocall_date是一个datetime列,你需要CONVERT它把一个字符串

select @ls_Sql=' 
    update #inv set Phys_Inv_Date = case when inventory_type = ''physical'' 
            then ''' + CONVERT(varchar,@call_date,112) + ''' 
            else b.inv_date end 
    from #inv a 
    JOIN (select top 1 call_date, rep_id 
     from inv_header 
     where call_date < ''' + CONVERT(varchar,@call_date,112) + ''' 
     and rep_id = ''' + rtrim(@rep_id) + ''') b 
    ON a.rep_id = b.rep_id 
    WHERE Phys_Inv_Date IS NULL'; 

这会给你一个YYYYMMDD格式的字符串,但是你仍然需要用引号括起来,就像你用@rep所做的一样_ID。但是,我猜测@rep_id实际上是int,所以你可以使用RTRIM将它转换为varchar。

还要注意多行字符串被允许在SQL Server和使你的代码了很多更具可读性。

相关问题