我在SQL Server 2008上的存储过程中出错。
只有当前元素不存在时,我才需要在我的表中执行操作并插入数据。
所以我创建了一个存储过程:
ALTER PROCEDURE [dbo].[upload_bank_file]
@date varchar(10),
@date_valeur varchar(10),
@libelle varchar(255),
@mode varchar(10),
@code varchar(10),
@date_effet varchar(10),
@debit float,
@credit float
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
print @credit;
IF Not EXISTS (SELECT 1 FROM dbo.bank_import WHERE dbo.bank_import.Libelle = @libelle)
--DROP PROCEDURE upload_bank_file;
Begin
IF (SUBSTRING(@date_effet, 4, 2) LIKE '01' AND SUBSTRING(@date, 1, 2) LIKE '12')
SET @date_effet = CONVERT(varchar, (CONVERT(int, SUBSTRING(@date, 7, 2)) + 1)) + '-' + @date_effet;
ELSE
SET @date_effet = SUBSTRING(@date, 7, 2) + '-' + @date_effet;
insert into dbo.bank_import ([Date], [Date_Valeur], [Libelle], [Mode], [Code], [Date_Effet], [Debit], [Credit])
VALUES (CONVERT(datetime, @date, 120), CONVERT(datetime, @date_valeur, 120), @libelle, @mode, @code, CONVERT(datetime, @date_effet, 120), @debit, @credit);
END
END
当我通过我的php moulinette测试它(自动化文件解析并调用存储过程)时,我收到以下错误:
[0] => 22007个
[SQLSTATE] => 22007个
[1] => 241个
[code] => 241个
[2] => [Microsoft] [SQL Server Native Client 11.0] [SQL Server]Échecdela conversion de la date et / ou de l'heureàpartird'unechaînedecaractères。
[message] => [Microsoft] [SQL Server Native Client 11.0] [SQL Server]Échecdela conversion de la date et / ou de l'heureàpartird'unechaînedecaractères。
我通过varchar
格式以及yyyy/mm/dd
格式mm/dd
格式将日期传递给存储过程。
SQL Server Management Studio,当我这样做时
@date
将错误定位在我的存储过程的第20行,这是我执行“If Exists(Select ...)”的行,仅当我的libelle不存在于表中时。
我几次用Google搜索了这个错误,但我发现没什么用处。我以EXEC upload_bank_file 'with', 'fake', 'parameters' ...
格式传递了日期,并且已将yyyy/mm/dd
标志指定给我的存储过程,但我的问题仍然存在。
如果有人有任何想法帮助我,我将不胜感激!
(英语不是我的母语,请原谅我的错误......)
谢谢!
答案 0 :(得分:2)
我通过varchar将日期传递给存储过程,在yyyy / mm / dd 格式,以及@date参数的 mm / dd格式。
当您将@date作为mm/dd
传递时,这部分失败了:
CONVERT(datetime, @date, 120)
你今天(7月16日)有效地打电话给你:
select CONVERT(datetime, '07/16', 120)
哪个失败,错误241,"从字符串转换日期和/或时间时转换失败。"
如果你过年,也会成功:
select CONVERT(datetime, '2014/07/16', 120)
如果您需要提取日期和月份值,请使用DATEPART
答案 1 :(得分:1)
SQL Server支持多种格式 - 请参阅MSDN Books Online on CAST and CONVERT。大多数格式都是依赖你所拥有的设置 - 因此,这些设置可能会有效 - 有时也不会。
解决此问题的方法是使用SQL Server支持的(略微调整的) ISO-8601日期格式 - 此格式始终 - 无论您的是什么SQL Server语言和日期格式设置。
SQL Server支持ISO-8601 format有两种形式:
YYYYMMDD
仅适用于日期(无时间部分);请注意:没有破折号!,这非常重要! YYYY-MM-DD
不独立于SQL Server中的dateformat设置, NOT 可以在所有情况下使用!或:
YYYY-MM-DDTHH:MM:SS
了解日期和时间 - 请注意:此格式有破折号(但可以可以省略),还有一个固定的T
作为DATETIME
的日期和时间部分之间的分隔符。这适用于SQL Server 2000及更高版本。
如果您使用SQL Server 2008或更高版本以及DATE
数据类型(仅DATE
- 不 DATETIME
!),那么您确实也可以使用YYYY-MM-DD
格式,也适用于SQL Server中的任何设置。
不要问我为什么整个主题都是如此棘手而且有点令人困惑 - 这就是它的方式。但是使用YYYYMMDD
格式,您可以适用于任何版本的SQL Server以及SQL Server中的任何语言和日期格式设置。
对于SQL Server 2008及更高版本的建议是,如果您只需要日期部分,则使用DATE
,当需要日期和时间时,使用DATETIME2(n)
。您应该尽可能尝试开始逐步淘汰DATETIME
数据类型