使用存储过程将数据类型nvarchar转换为datetime时出错

时间:2014-06-04 19:44:49

标签: sql tsql datetime stored-procedures openquery

[使用SQL Server 2008 R2 Enterprise x64 SP1]

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

  

Msg 8114,Level 16,State 1,Procedure spCalcProjection,Line 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),则会再次出现上述错误。

2 个答案:

答案 0 :(得分:1)

Conrad,在没有双引号的情况下发布GETDATE()的原始语法错误可能比您想象的更多。我也不明白为什么你需要在这里逃避这个功能。 (对不起,无法添加到您的线程与Lamak,没有足够的评论声誉)。另外,为什么需要一个打开的查询来调用你的sp?当你说SQL Server 2008 R2时,它是在呼叫方和你的[生产]服务器上吗?如果另一端不是SQL Server,则可能没有GETDATE()函数。如果另一端是SQL Server,则不需要OpenQuery。

<强> [UPDATE] 我想我有你的答案。您不能将函数用作存储过程的参数。与打开查询无关。你可以做什么,你可以用表值函数替换该存储过程。我只是尝试过它并且有效。

定义:

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())

答案 1 :(得分:1)

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

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

这样可以避免在db中创建任何其他对象。