2011-05-11 110 views
25

我測試的存儲過程,並希望提交 'GETDATE()' 函數中位置參數的:在執行存儲過程時使用函數作爲參數?

DECLARE @return_value int 
EXEC @return_value = my_store procedure 
     @MyId = 1, 
     @MyDateField = GETDATE() 
SELECT 'Return Value' = @return_value 
GO 

SQL Server 2005的抱怨與以下錯誤:

Incorrect syntax near ')'.

有人關心棚關於此事的一些啓示?

回答

12
每MSDN

Execute a stored procedure or function 
[ { EXEC | EXECUTE } ] 
    { 
     [ @return_status = ] 
     { module_name [ ;number ] | @module_name_var } 
     [ [ @parameter = ] { value 
          | @variable [ OUTPUT ] 
          | [ DEFAULT ] 
          } 
     ] 
     [ ,...n ] 
     [ WITH RECOMPILE ] 
    } 
[;] 

    Execute a character string 
    { EXEC | EXECUTE } 
     ({ @string_variable | [ N ]'tsql_string' } [ + ...n ]) 
     [ AS { LOGIN | USER } = ' name ' ] 
    [;] 

    Execute a pass-through command against a linked server 
    { EXEC | EXECUTE } 
     ({ @string_variable | [ N ] 'command_string [ ? ]' } [ + ...n ] 
      [ { , { value | @variable [ OUTPUT ] } } [ ...n ] ] 
     ) 
     [ AS { LOGIN | USER } = ' name ' ] 
     [ AT linked_server_name ] 
    [;] 

通告@parameter可以要麼指定一個值,要麼指定一個vari能夠或指定默認值。所以你必須將變量的值設置爲GetDate()(正如其他人指定的那樣)並使用該變量。

HTH

+0

謝謝Raja,這很有幫助,我必須學習閱讀發佈的定義。 – krul 2011-05-11 16:33:31

9

函數調用的參數不允許(除前綴@@這些系統的功能 - 即那些曾經被稱爲全局變量)

您需要分配給一個變量。

微軟承認這是小於大在這個相關連接項目:T-SQL: use scalar functions as stored procedure parameters

Agreed! More generally, wherever TSQL expects, say, and integer value, it should accept a literal, a variable, or the result of a function whose return type is integer. It just makes the language more regular ("orthogonal") and easier to learn/use.

That said, it's too late for this feature in the Katmai release, but I'll add it to our TODO list.

25

不能直接使用函數作爲存儲過程的參數。

你可以做到以下幾點:

DECLARE @now DateTime 
SET @now = GETDATE() 

DECLARE @return_value int 
EXEC @return_value = my_stored_procedure 
     @MyId = 1, 
     @MyDateField = @now 
SELECT 'Return Value' = @return_value 
GO 
+0

我知道我可以創建變量,但我很好奇這個構造。 – krul 2011-05-11 15:54:26

+0

@krul - 您使用的短語「在這個問題上提供了一些亮點」是不明確的。如果你想問爲什麼限制存在,你應該問清楚。 – Oded 2011-05-11 16:07:42

+1

@Oded:我不確定krul是否在意,但我想知道。爲什麼這個限制存在?在我所知的其他所有語言中,可以使用函數調用作爲參數,並以預期的方式工作(函數被評估,返回值作爲參數傳遞)。爲什麼SQL不允許這樣做? – 2012-06-25 18:34:00

0

嘗試:

DECLARE @return_value int 
EXEC @return_value = my_store procedure 
     @MyId = 1, 
     @MyDateField = (SELECT GETDATE()) 
SELECT 'Return Value' = @return_value 
GO 
-1

爲什麼你需要在GETDATE通過()。只需在被調用的存儲過程中使用它即可。

您無法直接將其傳入。只要將它分配給一個變量,並傳遞

DECLARE @dt as datetime 
SET @dt=GETDATE() 

EXEC @return_value = my_store procedure 
     @MyId = 1, 
     @MyDateField = dt 
1

你可以使用

DECLARE @test DATE; 
SET @test = GETDATE(); 

然後

DECLARE @return_value int 
EXEC @return_value = my_store procedure 
     @MyId = 1, 
     @MyDateField = @test 
SELECT 'Return Value' = @return_value 
GO 
相關問題