在sql过程中将varchar参数转换为datetime

时间:2015-03-26 19:05:54

标签: sql-server stored-procedures

以下是我的程序

create proc abc -- 'all','18','18','12/12/2015','','','inactive'   
@JoinedDate varchar(100),        
@LastLogin varchar(100),        
@Location varchar(100),        
@Status varchar(50) 

as        
declare @WhereCondition varchar(1000)   

set @WhereCondition=' '        
if @LastLogin !=''        
set @WhereCondition= ' and u.UpdatedDate>=' + CAST(@LastLogin as datetime) 

exec('select * from tableName where' + @WhereCondition)

当我传递参数LastLogin时,它给出了如下错误:

从字符串转换日期和/或时间时转换失败。

3 个答案:

答案 0 :(得分:3)

首先以正确的数据类型捕获数据,如果您期望datetime值,请使用变量的datetime数据类型。

不要在varchar中获取值然后尝试将它们转换为datetime(糟糕的做法),同时使用参数化动态sql不要将变量连接到动态sql中(为sql注入打开大门)。

见下文:

create proc abc -- 'all','18','18','12/12/2015','','','inactive'   
    @JoinedDate  datetime,        
    @LastLogin   datetime,        
    @Location    varchar(100),        
    @Status      varchar(50) 
AS
BEGIN
  SET NOCOUNT ON;
  DECLARE @Sql NVARCHAR(MAX);   

SET @Sql = N'select * from tableName where 1 = 1 '
      + CASE WHEN @LastLogin <> ''
        THEN N' AND UpdatedDate >= @LastLogin' ELSE N'' END

 Exec sp_executesql @Sql
                   ,N'@LastLogin datetime'
                   ,@LastLogin
END

答案 1 :(得分:2)

您无法将Datetime数据类型与字符串连接。

已编辑:

试试这个:

set @WhereCondition= ' and u.UpdatedDate>=CAST(''' + @LastLogin + ''' AS datetime)'

答案 2 :(得分:0)

我得到了解决方案,可以将datetime作为varchar参数传递给动态sql并将其动态转换为datetime -

以下是方式 -

set @WhereCondition= ' and u.UpdatedDate>=convert(datetime,''' +  @LastLogin + ''', 110)'