Ale*_*izz 6 sql t-sql sql-server-2008
假设我有一个使用表参数和表参数类型定义的存储过程
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
...
Run Code Online (Sandbox Code Playgroud)
我可以通过声明一个表变量来调用这个存储过程
DECLARE @V as dbo.P1
Run Code Online (Sandbox Code Playgroud)
用数据填充它
--tbl_V is just some table with data
INSERT INTO @V (id, name) SELECT id, name FROM tbl_V
Run Code Online (Sandbox Code Playgroud)
并调用存储过程
Execute dbo.usp_d
@id0=1, -- some value
@P1=@V
Run Code Online (Sandbox Code Playgroud)
我的问题:是否可以一步将查询直接传递给存储过程,而无需单独声明@P1变量并将数据插入其中,如下所示:
Execute dbo.usp_d
@id0=1, -- some value
@P1=(SELECT id, name FROM tbl_V)
Run Code Online (Sandbox Code Playgroud)
我相信简单的答案是,你不能。
<Speculative Rant>
对于 SqlServer 团队来说,这将是使用表值构造函数语法的理想机会,例如
Execute dbo.usp_d
@id0=1, -- some value
@P1= VALUES(1, 'Hello');
Run Code Online (Sandbox Code Playgroud)
(尽管有一些打字注意事项)。
同样,也不可能从 Table Valued Function 返回 Table 类型,这阻碍了至少执行构造函数 TVF 的机会:
Execute dbo.usp_d
@id0=1, -- some value
@P1= (SELECT * FROM dbo.ConstructorFunction(1, 'Hello'));
Run Code Online (Sandbox Code Playgroud)
最好是 Oracle 风格的嵌套表构造函数语法,例如
Execute dbo.usp_d
@id0=1, -- some value
@P1= TABLE(dbo.P1(1, 'Hello'));
Run Code Online (Sandbox Code Playgroud)
</Speculative Rant>
| 归档时间: |
|
| 查看次数: |
842 次 |
| 最近记录: |