以下是我的程序
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时,它给出了如下错误:
从字符串转换日期和/或时间时转换失败。
答案 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)'