存储过程转换失败

时间:2017-01-20 08:12:37

标签: sql-server stored-procedures

我正在创建一个存储过程,其中我有3个“动态”参数,第一个是int,第二个和第三个是datetime

输出结果如何:

17 | 2016-01-24 11:28:22.233 | 2016-05-22 09:07:04.220

由于我的最终应用程序正在连接到此存储过程,因此我必须将日期时间值视为nvarchar才能使用LIKE运算符,以便用户可以轻松过滤投掷那些日期时间的

我所做的是创建工作正常的查询获取所需的输出

SELECT * 
FROM WATCHDOG.WatchdogUsr.WebsiteFailureLog
WHERE websiteID  = 17
  AND (((CONVERT(NVARCHAR(45), FailureLogStart, 121) LIKE '%2016-01%')))

但我的存储过程存在问题:

  

消息241,级别16,状态1,过程WatchDogDataCollector,第5行
  从字符串转换日期和/或时间时转换失败。

这是我的存储过程:

ALTER PROCEDURE [dbo].[WatchDogDataCollector] 
    @websiteID int = NULL, 
    @FailureLogStart NVARCHAR = NULL
AS 
    SELECT * 
    FROM WATCHDOG.WatchdogUsr.WebsiteFailureLog
    WHERE websiteID  = ISNULL(@websiteID,websiteID) 
      AND (((CONVERT(NVARCHAR(45), FailureLogStart, 121) LIKE '%'+@FailureLogStart+'%')))

表架构:

enter image description here

1 个答案:

答案 0 :(得分:1)

好吧,如果您无法确定用户输入的日期部分,那么您唯一的选择就是将日期时间值转换为字符串:

ALTER PROCEDURE [dbo].[WatchDogDataCollector] 
    @websiteID int = NULL, 
    @FailureLogStart VARCHAR(23) = NULL
AS 
SELECT * 
FROM WATCHDOG.WatchdogUsr.WebsiteFailureLog
WHERE websiteID  = ISNULL(@websiteID,websiteID) 
AND (((CONVERT(CHAR(23), FailureLogStart, 121) LIKE '%'+@FailureLogStart+'%')))

注意:表示日期时间且字符为121的字符串中的字符数为23.没有必要转换为nvarchar(45)。

相关问题