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

标签 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)

最佳答案

我相信简单的答案是,你不能。
<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>

关于sql - 将子查询直接传递给 SQL Server 中 USP 中的表类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22487039/

相关文章:

sql - 如何让 2 个查询使用 2 个 CPU

sql - 合并两个 SQL 脚本在 Select 查询中使用 if 条件

sql-server-2005 - T-SQL:无法将串联字符串作为参数传递给存储过程

c# - SqlCommand 只返回一行

java - SQL 客户端中的 HSQLDB 数据库

mysql - 无法运行看似对其他人有效的 MySQL 代码

asp.net - 缓存没有通知和轮询,还有其他方法吗

python - Django 管理面板无法向表中添加任何记录

sql - 在sql server中舍入小数

sql - 创建表后立即使用表 : object does not exist