[使用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)
,则会再次出现上述错误。
答案 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中创建任何其他对象。