请问如何把两具存储过程执行结果存入变量表的两个字段?要在同一行

e哥 2017-06-27 03:53:27
declare @a table(a nvarchar(64),b nvarchar(64))
insert @a(a,b) (exec ins 'g','水果','nm'),(exec ins 'person','苹果','nm')--ins是个过程,会返回一个值

select * from @a
请问怎么才能把两个存储过程的执行结果存入a、b两个字段中?

...全文
534 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
q858187064 2017-09-22
  • 打赏
  • 举报
回复
alter procedure abc ( @a nvarchar(222),--要执行的存储过程a @b nvarchar(222),--要执行的存储过程b @c nvarchar(99)--将ab执行结果插入c ) as declare @ia nvarchar(222), @ib nvarchar(222), @ic nvarchar(222), @s nvarchar(888)=N'exec @ia= '+dbo.argQuote(@a);--存储过程中各字段以下划线分_分隔 declare @m bit=0; if(isnumeric(@b)=1) set @ib=@b; else begin declare @n int=charindex('&',@b); if(@n>0) set @m=1; if(@m=1) begin declare @v1 nvarchar(99)=substring(@b,0,@n), @v2 nvarchar(99)=substring(@b,@n+1,len(@b)-@n); end if(@m=0) set @s+=';exec @ib= '+dbo.argQuote(@b); else set @s+=';exec @ib= '+dbo.argQuote(@v1)+';exec @ic= '+dbo.argQuote(@v2); end set @s+=';insert '+@c+' values(@ia,@ib);'; --set @s+='set @r=@ia+@ib'; --set @r='@ia,@ib'; if(@m=1) begin set @s+='insert '+@c+' values(@ia,@ic);'; --set @r+=',@ic';set @r+=,@ic; end --set @s+=@r; print 'abc print:'+@s exec sp_executesql @s,N'@ia nvarchar(222) output,@ib nvarchar(222) output,@ic nvarchar(222) output',@ia output,@ib output,@ic output declare @r nvarchar(222)=@ia+','+@ib; if(@ic!='')set @r+=','+@ic; select @r go
Ginnnnnnnn 2017-06-30
  • 打赏
  • 举报
回复
。。不支持这种写法的,建议你在存储过程里面搞个output参数然后最后insert这个参数就好了。
xiaoxiangqing 2017-06-28
  • 打赏
  • 举报
回复
这个只能分开保存,最后通过ID来关联合并到一行上
  • 打赏
  • 举报
回复
先放到 两张临时表里面,再insert到目标表 也可以
道素 2017-06-28
  • 打赏
  • 举报
回复
如果是返回的一个值,你可以在定义存储过程时用OUTPUT变量 这样将两次执行输入的变量一次性插入表就行了

CREATE PROCEDURE [dbo].[sp_test] @i INT ,@o INT OUTPUT
AS
BEGIN
     SET @o=@i*100
END

DECLARE @o1 INT,@o2 INT 
EXEC dbo.sp_test @i = 10,@o=@o1 OUTPUT
EXEC dbo.sp_test @i = 20,@o=@o2 OUTPUT
SELECT @o1,@o2

-------
1000	2000
吉普赛的歌 版主 2017-06-28
  • 打赏
  • 举报
回复
USE tempdb
GO
IF EXISTS( SELECT * FROM sys.procedures AS p WHERE p.[object_id]=OBJECT_ID('ins') )
	DROP PROC ins
GO
CREATE PROC [ins]
@p1 NVARCHAR(20),
@p2 NVARCHAR(20),
@p3 NVARCHAR(20)
AS
BEGIN
	SET NOCOUNT ON
	SELECT @p1+'_'+@p2+'_'+@p3
END
GO
--下面是正式调用
declare @a table(a nvarchar(64),b nvarchar(64))

DECLARE @r TABLE (rowNum INT IDENTITY(1,1), r NVARCHAR(MAX))
INSERT INTO @r(r)
exec ins 'g','水果','nm'

INSERT INTO @r(r)
exec ins 'person','苹果','nm'

insert @a(a,b) 
SELECT (SELECT r FROM @r WHERE rowNum=1),(SELECT r FROM @r WHERE rowNum=2)

select * from @a
/*
a	        b
g_水果_nm	person_苹果_nm
*/

e哥 2017-06-27
  • 打赏
  • 举报
回复
引用 5 楼 sinat_28984567 的回复:
帖子重复了……
ALTER PROCEDURE ins
    (
      @t NVARCHAR(32) ,--表名
      @v NVARCHAR(222) ,--值,多个时以逗号(',')分隔,不用加引号
      @n NVARCHAR(222) = ''--字段名,多个时以逗号(',')分隔,当插入全部字段时可缺省
    )
AS
    DECLARE @s NVARCHAR(444);--执行的sql
    SET @s = N'insert ' + @t + ' ';
    IF ( @n != '' )
        SET @s = @s + '(' + @n + ')';
    BEGIN
        SET @v = '''' + REPLACE(@v, ',', ''',''') + ''''--2个单引号会替换成3个
        SET @v = REPLACE(@v, '''''''', '''''')--3个单引号换回2个
    END
    SET @s = @s + 'values(' + @v + ')' + ';select scope_identity()';
    EXEC(@s)
GO
没重复,是两个问题
二月十六 版主 2017-06-27
  • 打赏
  • 举报
回复
帖子重复了……
ALTER PROCEDURE ins
    (
      @t NVARCHAR(32) ,--表名
      @v NVARCHAR(222) ,--值,多个时以逗号(',')分隔,不用加引号
      @n NVARCHAR(222) = ''--字段名,多个时以逗号(',')分隔,当插入全部字段时可缺省
    )
AS
    DECLARE @s NVARCHAR(444);--执行的sql
    SET @s = N'insert ' + @t + ' ';
    IF ( @n != '' )
        SET @s = @s + '(' + @n + ')';
    BEGIN
        SET @v = '''' + REPLACE(@v, ',', ''',''') + ''''--2个单引号会替换成3个
        SET @v = REPLACE(@v, '''''''', '''''')--3个单引号换回2个
    END
    SET @s = @s + 'values(' + @v + ')' + ';select scope_identity()';
    EXEC(@s)
GO
Tiger_Zhao 2017-06-27
  • 打赏
  • 举报
回复
RETRUN @s 加在 go 语句前。 又:@v 已经拼接到 @s 中了, sp_executesql 和 @v 没关系(不需要传递)。
e哥 2017-06-27
  • 打赏
  • 举报
回复
不好意思,刚引用错了
引用 1 楼 yupeigu 的回复:
你要先把存储过程的结果存到2个变量,在用insert语句引用这2个变量
我也是这样想的,但是当我返回时就报错:在此上下文中不能使用带有返回值的 RETURN 语句 alter procedure ins ( @t nvarchar(32),--表名 @v nvarchar(222),--值,多个时以逗号(',')分隔,不用加引号 @n nvarchar(222)=''--字段名,多个时以逗号(',')分隔,当插入全部字段时可缺省 ) as declare @s nvarchar(444);--执行的sql set @s=N'insert '+@t+' '; if(@n!='') set @s=@s+'('+@n+')'; begin set @v=''''+replace(@v,',',''',''')+''''--2个单引号会替换成3个 set @v=replace(@v,'''''''','''''')--3个单引号换回2个 end set @s=@s+'values('+@v+')'+';select scope_identity()';--这里改成return就报错:在此上下文中不能使用带有返回值的 RETURN 语句 exec sp_executesql @s,N'@v as nvarchar(222)',@v=@v go exec ins 'g','水果',nm 这样的问题:http://bbs.csdn.net/topics/392185313
e哥 2017-06-27
  • 打赏
  • 举报
回复
引用 楼主 QQ154485585 的回复:
declare @a table(a nvarchar(64),b nvarchar(64)) insert @a(a,b) (exec ins 'g','水果','nm'),(exec ins 'person','苹果','nm')--ins是个过程,会返回一个值 select * from @a 请问怎么才能把两个存储过程的执行结果存入a、b两个字段中?
我也是这样想的,但是当我返回时就报错:在此上下文中不能使用带有返回值的 RETURN 语句 alter procedure ins ( @t nvarchar(32),--表名 @v nvarchar(222),--值,多个时以逗号(',')分隔,不用加引号 @n nvarchar(222)=''--字段名,多个时以逗号(',')分隔,当插入全部字段时可缺省 ) as declare @s nvarchar(444);--执行的sql set @s=N'insert '+@t+' '; if(@n!='') set @s=@s+'('+@n+')'; begin set @v=''''+replace(@v,',',''',''')+''''--2个单引号会替换成3个 set @v=replace(@v,'''''''','''''')--3个单引号换回2个 end set @s=@s+'values('+@v+')'+';select scope_identity()';--这里改成return就报错:在此上下文中不能使用带有返回值的 RETURN 语句 exec sp_executesql @s,N'@v as nvarchar(222)',@v=@v go exec ins 'g','水果',nm
LongRui888 2017-06-27
  • 打赏
  • 举报
回复
你要先把存储过程的结果存到2个变量,在用insert语句引用这2个变量

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧