2015-05-20 28 views
3

以下簡單的SQL示例返回錯誤。SQL錯誤:將表參數傳遞給表值函數時必須聲明「標量變量」

這裏是一個的傳遞給表值函數表類型:

CREATE TYPE Ids 
    AS TABLE 
    (
     Id int NOT NULL, 
     PRIMARY KEY(Id) 
    ); 
GO 

這裏是失敗的表值函數:

CREATE FUNCTION GetIds 
(
    @ids -- or null 
     Ids READONLY 
) 
RETURNS 
    @result 
     TABLE 
     (
      EachId int 
     ) 
AS 
BEGIN 
    IF @ids IS NOT NULL 
     INSERT INTO @result 
      SELECT Id 
      FROM @ids; 
    RETURN; 
END; 
GO 

返回的錯誤是:

Msg 137, Level 16, State 1, Procedure GetIds, Line 28
Must declare the scalar variable "@ids".

我讀過的帖子說,它發生在SQL兼容性級別太舊時發生,但以下退貨100:

SELECT compatibility_level 
FROM sys.databases 
WHERE name = 'TheDatabaseName'; 

任何建議將不勝感激。

+0

錯誤是因爲您使用了未聲明的變量。示例'declare @ids table(Ids int)' –

+0

S.Visser:它被聲明爲Ids類型。這是你如何傳遞一個表作爲參數。 – uncaged

+0

其創建,未聲明。如果你引用它,你需要聲明它。認爲這將是MSDN文檔將解釋https://msdn.microsoft.com/en-us/library/bb510489.aspx –

回答

1

讓我告訴你,表類型參數就像數據表一樣。

所以,如果你想要把if條件就可以了,然後,

只是改變你如果功能如下條件:

IF (select count(*) from @ids) > 0 

功能齊全的代碼是:

CREATE FUNCTION GetIds 
(
@ids Ids READONLY  
) 
RETURNS @result TABLE(EachId int) 
AS 
BEGIN 
IF (select count(*) from @ids) > 0 
    INSERT INTO @result 
    SELECT Id FROM @ids;    
RETURN; 
END; 
+0

這幾乎就是我如何解決這個問題,雖然我寧願能夠通過NULL。順便說一句,我認爲IF EXISTS(SELECT * FROM @ids)可能比確定行數並將其與0進行比較要有效得多。 – uncaged

0

只是檢查你是否有任何記錄表

if(select count(1) from @ids)>0 
相關問題