表值参数是否可以用作存储过程的输出参数?
这是我想在代码中做的事情
/*First I create MY type */
CREATE TYPE typ_test AS TABLE
(
id int not null
,name varchar(50) not null
,value varchar(50) not null
PRIMARY KEY (id)
)
GO
--Now I want to create stored procedu whic is going to send output type I created,
--But it looks like it is inpossible, at least in SQL2008
create PROCEDURE [dbo].sp_test
@od datetime
,@do datetime
,@poruka varchar(Max) output
,@iznos money output
,@racun_stavke dbo.typ_test READONLY --Can I Change READONLY with OUTPUT ?
AS
BEGIN
SET NOCOUNT ON;
/*FILL MY OUTPUT PARAMS AS I LIKE */
end
不,不幸的是,表值参数是只读的并且只能输入。总体而言,如何在存储过程之间共享数据中很好地涵盖了该主题,其中介绍了所有替代方案。我的建议是使用一张
#temp
桌子。这是一篇较旧的帖子,但当我搜索“表值参数作为存储过程的输出参数”时,它接近顶部。虽然我的理解是您不能将表值参数作为输出参数传递,但我想目标是在另一个过程中将该表值输出参数用作表值输入参数。我将举例说明我是如何完成这项工作的。
首先,创建一些要使用的数据:
接下来,创建一个存储过程来捕获一些数据。通常,这将是您尝试创建表值输出参数的地方。
此外,您需要创建一个数据类型(表类型),其中第一个存储过程中的数据可以作为下一个存储过程的输入参数传递。
接下来,创建将接受表值参数的第二个存储过程。
当然,这不是一个真正的表值输出参数,但它可能会产生与您要寻找的结果相似的结果。声明表值参数,通过在其中执行存储过程来填充数据,然后将其用作下一个过程的输入变量。
除了remus 的精彩回答,包括他提供的链接
如何在存储过程之间共享数据
在将存储过程的结果保存到表中时,有时会收到以下错误消息:
INSERT EXEC 语句不能嵌套。
当前事务无法提交,也无法支持写入日志文件的操作。回滚事务
当这种情况发生在我为自己使用而开发的存储过程中时
例如,一个工具可以告诉我
login
它所属的所有 AD 组及其在服务器中所有数据库中的所有权限我在过程之外创建一个临时表并将其名称作为参数传递
在程序内部,经过所有计算,当我返回最终数据时(下面是一个示例),我检查我们是输出到表格还是只是返回到屏幕并动态创建脚本。
之后,您可以在屏幕上获得所需的信息,或者如果您已将临时表作为参数传递,它现在将拥有数据。
这是我找到的一种解决方案,但我只将它用于我自己的工作,
DBA
否则这将被视为Sql Injection的高风险。可以将表转换为 JSON(SQL Server 2016 或更高版本)并作为 nvarchar 参数传递:
[{"value":"abc","ordinal":1},{"value":"def","ordinal":2}]
然后要将其转换回表,请将列名指定为 JSON 键: