3

我有一個執行一些重複代碼的存儲過程,所以我決定將冗餘代碼變成表值函數。我現在遇到的問題是:從一個存儲過程執行一個表值函數並傳遞多個表值類型的參數?

Msg 137, Level 16, State 1, Procedure Search, Line 98 
Must declare the scalar variable "@myTVP". 

我使用的SQL代碼的一個簡單的例子是:

CREATE TYPE [dbo].textTable_type AS TABLE(
[text] [nvarchar] (36) 
) 

CREATE FUNCTION dbo.Search_fn 
(@myTVP AS textTable_type READONLY) 
RETURNS TABLE 
AS 
RETURN 
( SELECT * from @myTVP ) 
GO 

CREATE PROCEDURE [dbo].[Search] 
@myTVP AS textTable_type READONLY 
AS 
BEGIN 

SELECT * FROM dbo.Search_fn(@myTVP) 

END 
GO 

DECLARE @TVP as textTable_type 
INSERT INTO @TVP VALUES ('abc') 
INSERT INTO @TVP VALUES ('123') 
exec dbo.Search(@myTVP = @TVP) 
GO 

DROP FUNCTION Search_fn 
DROP PROCEDURE Search 

如果任何人都可以提供任何見解,那將是美好的!

(有幾個額外的錯誤,如果你嘗試運行這個例子,但它們都來源於包含錯誤,問題是由於存儲過程的搜索不能創建。

謝謝。

回答

1

這對我的作品。(由從存儲過程調用一些Go批次分隔符和去除括號)

如果這不適合你什麼是你的數據庫的兼容級別?

CREATE TYPE [dbo].textTable_type AS TABLE(
[text] [nvarchar] (36) 
) 
GO 

CREATE FUNCTION dbo.Search_fn 
(@myTVP AS textTable_type READONLY) 
RETURNS TABLE 
AS 
RETURN 
( SELECT * from @myTVP ) 
GO 


CREATE PROCEDURE [dbo].[Search] 
@myTVP AS textTable_type READONLY 
AS 
BEGIN 

SELECT * FROM dbo.Search_fn(@myTVP) 

END 
GO 

DECLARE @TVP as textTable_type 
INSERT INTO @TVP VALUES ('abc') 
INSERT INTO @TVP VALUES ('123') 
exec dbo.Search @myTVP = @TVP 

GO 

DROP FUNCTION [dbo].Search_fn 
DROP PROCEDURE [dbo].Search 
DROP TYPE [dbo].textTable_type 
+0

我假設因爲我的兼容性級別是80,它不會工作。 – Brett 2010-09-27 15:58:32

相關問題