【问题标题】:Executing a Table-Valued Function from a Stored Procedure with multiple Table-Valued Parameters being passed through?在传递多个表值参数的存储过程中执行表值函数?
【发布时间】:2011-04-17 18:21:52
【问题描述】:

我有一个执行一些重复代码的存储过程,所以我决定将冗余代码变成一个表值函数。我遇到的问题是:

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

如果有人能提供任何见解,那就太好了!

(如果您尝试运行此示例,则会出现一些额外的错误,但它们源于包含的错误。问题是因为无法创建存储过程 Search。

谢谢。

【问题讨论】:

    标签: sql sql-server sql-server-2008 code-reuse user-defined-functions


    【解决方案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
    

    【讨论】:

    • 我假设因为我的兼容性级别是 80,所以它不会工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多