Sql server 存储过程转换失败

Sql server 存储过程转换失败,sql-server,stored-procedures,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

我正在创建一个存储过程,其中有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%')))
但我的存储过程有一个问题:

Msg 241,16级,状态1,过程监视器数据采集器,第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+'%')))
表架构:


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

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)没有意义。

请发布您的表架构…
@FailureLogStart
属于
datetime
-您不能像
2016-01那样将部分日期值传递给它。您需要将数据类型更改为
varchar
@mitchanupdate@ZoharPeled我用这一行((CONVERT(NVARCHAR(45),FailureLogStart,121)或不?您应该始终为任何
(n)提供一个长度varchar
您使用的变量和参数-对于存储过程参数,省略长度会导致参数的长度正好为一个字符!这通常不是您想要的……我只想告诉您,您在注释中给了我答案!!感谢您的时间和精力:)