【发布时间】: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变量和参数提供长度 - 对于存储过程参数,省略长度结果在恰好一个字符长度!的参数中,这通常不是你想要的.....
标签: sql-server stored-procedures