存储过程转换失败

Posted

技术标签:

【中文标题】存储过程转换失败【英文标题】:Stored procedure conversion failed 【发布时间】:2017-01-20 08:12:36 【问题描述】:

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

表架构:

【问题讨论】:

请发布您的表格架构... @FailureLogStart 的类型为 datetime - 您不能像 2016-01 那样将部分日期值传递给它。您需要将数据类型更改为varchar @MitchWheat 女仆更新 @ZoharPeled 好吧,我用这一行 (((CONVERT(NVARCHAR(45), FailureLogStart, 121) 吗? Bad habits to kick : declaring VARCHAR without (length) - 您应该始终为您使用的任何 (n)varchar 变量和参数提供长度 - 对于存储过程参数,省略长度结果在恰好一个字符长度!的参数中,这通常不是你想要的..... 【参考方案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) 没有意义。

【讨论】:

我只是想告诉你,你在 cmets 中给了我答案!感谢分配您的时间和精力:)

以上是关于存储过程转换失败的主要内容,如果未能解决你的问题,请参考以下文章

佩特来项目经验小集合___组合查询存储过程,报错 "varchar JBID='' 转换成数据类型 int 时失败"(示例代(代码

SQL数据库里面显示在将 varchar 值 'S' 转换成数据类型 int 时失败。 下面是存储过程 麻烦看下 是否有错

从字符串转换日期时间时转换失败

带有DateTime列的DataTable抛出“转换日期和/或时间时转换失败”

特定存储过程的删除命令失败

从SQL代理作业调用时,工作存储过程失败