【发布时间】:2015-02-08 21:14:52
【问题描述】:
使用 SQL Server 2012,是否可以消除声明表值参数 (TVP) 的需要,只需将其传递到存储过程?下面是一个非常简单的存储过程 (SP) 示例,它采用 TVP 和一个工作示例来执行该 SP,我必须在其中声明 TVP,填充它,然后将其传递给 SP。我希望能够简单地将人口标准直接传递给 EXEC 调用。这可能吗?
场景设置:
-- Create a sample Users table
CREATE TABLE Users (UserID int, UserName varchar(20))
INSERT INTO Users VALUES (1, 'Bob'), (2, 'Mary'), (3, 'John'), (4, 'Mark')
-- Create a TVP Type
CREATE TYPE UserIdTableType AS TABLE (UserID int)
-- Create SP That Uses TVP Type
CREATE PROCEDURE GetUsers
@UserIdFilter UserIdTableType READONLY
AS
SELECT * FROM @UserIdFilter WHERE UserID > 2
要执行的工作方法:
DECLARE @MyIds AS UserIdTableType
INSERT INTO @MyIds SELECT UserID FROM Users
EXEC GetUsers @MyIds
请求的执行方法:
EXEC GetUsers (SELECT UserID FROM Users)
【问题讨论】:
-
这是一个 TVP,程序不期望选择查询,您需要声明一个该程序接受的特定类型的 TVP,填充它然后将其传递给 proc,您不能简单只需传递一个选择查询而不是 TVP。
-
@M.All,有没有办法在一行中将其转换为 TVP?像
EXEC GetUsers CAST((SELECT UserID FROM Users) as UserIdTableType)这样的东西?我只是在寻找一种让调用代码看起来更干净的捷径。 -
不,你不能,但你可以按原样传递你的查询,作为参数并在你的proc中执行它,你需要使用动态sql。
-
是的,这就是我要避免的。
-
@bigmac 只是好奇你是否有机会尝试一下。它确实避免了动态 SQL :-)。
标签: sql-server stored-procedures table-valued-parameters