sql - 从传递多个表值参数的存储过程执行表值函数?

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

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

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。

谢谢你。

最佳答案

这对我有用。 (添加了一些 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

关于sql - 从传递多个表值参数的存储过程执行表值函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3803942/

相关文章:

java - SQLStateConverter.handledNonSpecificException hibernate

mysql - SQL通过将列舍入到最接近的值来返回基于两列的不同行

sql-server - "NOT"什么时候不是否定?

sql-server - 谁应该是新架构的所有者?

mysql - 在mysql中显示计数值和多行

sql - 是否可以找到用于在 SQL SERVER CLR 中加载程序集的原始路径?

MySQL 和性能

sql - 访问第一行并立即将其删除

sql-server - sql server 2008 的缺点是什么(与 2005 相比)

c# - 数据库表的低内存遍历