【问题标题】:Insert date into table variable does not work in SSMS but works at runtime将日期插入表变量在 SSMS 中不起作用,但在运行时起作用
【发布时间】:2014-01-29 10:44:45
【问题描述】:

我正在开发的一个应用程序在保存数据时出现了一些我无法解释的奇怪行为。该应用程序使用自定义 c# 数据层。当进行保存时,它将数据插入到表变量中,然后执行存储过程来保存数据,将表变量作为参数传递。保存在应用程序运行时有效,但是当我分析正在运行的 sql 时,由于到日期时间的转换失败,我无法在 SSMS 中执行查询。 profiler 记录的 SQL 示例如下,我也添加到 table 变量中以供参考。

表变量...

CREATE TYPE [dbo].[ExampleType] AS TABLE(
    [Name] [nvarchar](200) NOT NULL DEFAULT (''),
    [CreationDate] [datetime] NULL,
    [UpdateDate] [datetime] NULL
)

来自探查器的 sql...

declare @p1 dbo.ExampleType
insert into @p1 values(N'','2014-01-29 09:48:18.8000000','2014-01-29 10:05:31.9647267')

exec [dbo].[save_Example] @tableParameter=@p1

当应用程序运行时,我可以在表格中看到保存的数据,并且日期时间被截断为日期时间格式,即最后 4 个字符被删除并保存数据。我是否在探查器中遗漏了一些允许 sql 运行的内容,还是有其他解释?

【问题讨论】:

  • 当您尝试在 SSMS 中运行它时会发生什么?无效的日期错误?两次登录的默认语言设置是什么?
  • 运行插入时收到的错误是从字符串转换日期和/或时间时转换失败。
  • Profiler 中显示的内容只是实际调用的文本表示。它实际上并没有执行该文字字符串as explained here
  • 尝试执行这个与区域无关的表示:插入@p1 values(N'','2014-01-29T09:48:18.8000000','2014-01-29T10:05:31.9647267' )

标签: sql sql-server sql-server-2008 sql-server-profiler


【解决方案1】:

Martin 给出的答案在我看来是正确的,并解释了我所看到的行为。

来自他的评论的链接...

Why does SqlClient use unnecessary XML conversion while passing SqlXml?

【讨论】:

    【解决方案2】:

    您必须将其插入到变量中。例如

    @CurrentDate = CONVERT(DATETIME, '2014-01-09 09:48:18')
    INSERT INTO @p1 VALUES (.., @CurrentDate, ...)
    

    【讨论】:

    • 是的,这可行,但这不是我的问题。我的问题中的 sql 是 SQL Server Profiler 的输出,用于所有意图和目的。在 SSMS 中运行此 sql 失败,但在应用程序运行时有效。是否有来自应用程序的设置允许语句运行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多