将子查询直接传递给SQL Server中USP中的表类型参数

时间:2014-03-18 17:43:55

标签: sql sql-server-2008 tsql

假设我有一个使用表参数和表参数类型

定义的存储过程
CREATE Type dbo.P1 AS TABLE 
(
    Id Int NOT NULL,
    Name nvarchar(50) NULL
)

CREATE PROCEDURE [dbo].[usp_D]
(
    @id0 Int,
    @P1 dbo.P1 READONLY
)
AS
...

我可以通过声明表变量

来调用此存储过程
DECLARE @V as dbo.P1 

用数据填充

--tbl_V is just some table with data
INSERT INTO @V (id, name) SELECT id, name FROM tbl_V

并调用存储过程

Execute dbo.usp_d 
  @id0=1, -- some value
  @P1=@V

我的问题:是否可以一步将查询直接传递给存储过程,而无需单独声明@P1变量并将数据插入其中,如下所示:

Execute dbo.usp_d 
      @id0=1, -- some value
      @P1=(SELECT id, name FROM tbl_V)

1 个答案:

答案 0 :(得分:3)

我相信简单的答案是,你不能。

<Speculative Rant>

这对SqlServer团队来说是一个理想的机会,可以使用Table Valued Constructor语法,例如

Execute dbo.usp_d 
      @id0=1, -- some value
      @P1= VALUES(1, 'Hello');

(虽然有一些打字注意事项)。

同样,它也是not possible to return a Table type from a Table Valued Function,它至少阻碍了构建者TVF的机会:

Execute dbo.usp_d 
      @id0=1, -- some value
      @P1= (SELECT * FROM dbo.ConstructorFunction(1, 'Hello'));

最好的是Oracle风格的嵌套表构造函数语法,例如

Execute dbo.usp_d 
      @id0=1, -- some value
      @P1= TABLE(dbo.P1(1, 'Hello'));

</Speculative Rant>