【问题标题】:Error converting data type nvarchar to datetime with stored procedure使用存储过程将数据类型 nvarchar 转换为 datetime 时出错
【发布时间】:2014-07-25 14:53:48
【问题描述】:

[使用 SQL Server 2008 R2 Enterprise x64 SP1]

我正在尝试使用某种形式的 GETDATE() 将今天的日期传递给 OPENQUERY() 内的存储过程,但我不断收到错误

消息 8114,级别 16,状态 1,过程 spCalcProjection,第 0 行
将数据类型 nvarchar 转换为 datetime 时出错

这是代码(spCalcProjection 采用datetime):

SELECT top 1 multi FROM OPENQUERY([production], 'exec proddb.dbo.spCalcProjection "GETDATE()"')

如果我使用2014-05-22 或任何文字代替GETDATE(),那么我没有问题并得到正确的预期结果。如果我使用CAST(GETDATE() AS DATE)CONVERT(varchar, GETDATE(), 112) 之类的其他功能,则会再次出现上述错误。

【问题讨论】:

  • 你为什么在GETDATE()中使用双引号?,不用它们试试
  • @Lamak 我使用双引号是因为它们是必需的,否则会产生语法错误。这些或双单引号是转义 t-sql 所必需的。
  • 使用两个单引号与双引号完全不同。您使用的是哪一个,它们完全等效
  • @Lamak 我都试过了。
  • 正如我所说,您应该尝试不使用它们。听着,使用双引号是语法错误,不起作用。并且也不需要用于“转义”字符串连接的 2 个单引号,这可能是您的错误的根源,因为它试图将 GETDATE() 连接起来,就好像它是一个字符串一样

标签: sql tsql datetime stored-procedures openquery


【解决方案1】:

Conrad,发布不带双引号的 GETDATE() 的原始语法错误可能比您想象的更有帮助。我也不明白你为什么需要在这里转义这个函数。 (抱歉,无法添加到您与 Lamak 的话题中,因为 cmets 的声誉不足)。另外,为什么你需要一个开放的查询来调用你的 sp?当您说 SQL Server 2008 R2 时,它是在调用端还是在您的 [生产] 服务器上?如果另一端不是 SQL Server,它可能没有 GETDATE() 函数。如果另一端是 SQL Server,则不需要 OpenQuery。

[更新] 我想我有你的答案。您不能将函数用作存储过程的参数。与公开查询无关。你可以做什么,你可以用表值函数替换那个存储过程。我刚刚试了一下,效果很好。

定义:

CREATE FUNCTION TestFun
(
    @TestDateParam datetime
)
RETURNS 
@RetTable TABLE 
(
    Line nvarchar(20)
)
AS
BEGIN
    INSERT INTO @RetTable
    SELECT aString
        FROM sometable
        WHERE aDate = @TestDateParam

    RETURN 
END

呼叫:

SELECT *
FROM dbname.dbo.TestFun(GETDATE())

【讨论】:

  • 我需要通过OPENQUERY() 调用SP,因为这是在视图中。我从 [生产] 和它那里打电话。这是我不使用任何引号时的错误:链接服务器“生产”的 OLE DB 提供程序“SQLNCLI10”返回消息“延迟准备无法完成。”。消息 8180,级别 16,状态 1,行 1 声明无法准备。消息 102,级别 15,状态 1,第 1 行 ')' 附近的语法不正确。
  • 用建议的解决方案更新了我的答案。
  • 这是我的备份解决方案 - 我希望不必在数据库中创建额外的 TVF。
【解决方案2】:

从其他地方得到了我将使用的答案:

SELECT top 1 multi FROM OPENQUERY([production], 'DECLARE @dt datetime SELECT @dt = GETDATE() exec proddb.dbo.spCalcProjection @dt')

这避免了必须在数据库中创建任何其他对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2012-07-23
    • 2018-04-06
    • 2014-03-14
    • 1970-01-01
    • 2016-03-14
    相关资源
    最近更新 更多