首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不知道列的情况下联合两个存储过程的记录

如何在不知道列的情况下联合两个存储过程的记录
EN

Stack Overflow用户
提问于 2019-04-01 21:56:21
回答 2查看 138关注 0票数 0

我有两个存储过程,它们返回相同但未知的列。我需要编写一个proc来组合这两个存储过程的结果。我尝试过OPENROWSET,但问题是在OPENROWSET函数中提供连接字符串,即使我指定了一次连接字符串,它在不同的环境下会有所不同,我认为每次在不同的环境中部署应用程序或在服务器上更改用户时更改连接字符串都是最糟糕的事情。有人能帮我以最好的方式完成这件事吗?

我不能把它们写成函数,因为procs正在使用临时表。

代码语言:javascript
运行
复制
Declare @connection nvarchar(200)
Declare @sql nvarchar(max)
Set @connection= 'Server=servername;initial 
catalog=dbname;user=abc,password=xyz';
Set @sql='SELECT * INTO #temp1
FROM OPENROWSET(
           ''SQLNCLI'',
           '''+ @connection + ''',
           ''EXEC sp_name '')'

Exec(@sql)
EN

回答 2

Stack Overflow用户

发布于 2019-04-11 20:21:13

代码语言:javascript
运行
复制
--- creating a temporary table
CREATE Table #Dynamic_Temp_Table (_field_only_for_create_ INT )

--- Addition of fields from the first recordset from the first procedure
DECLARE @SQL NVARCHAR(MAX) 
SELECT @SQL=ISNULL(@SQL+',','ALTER TABLE #Dynamic_Temp_Table ADD ')+name+' '+system_type_name 
    FROM sys.dm_exec_describe_first_result_set('exec sp_proc_first', NULL, NULL) 
    order by column_ordinal
exec sp_executesql @SQL 

--- Remove of the first unused column
ALTER TABLE #Dynamic_Temp_Table drop column _field_only_for_create_

--- Addition of the result from the first procedure
INSERT INTO #Dynamic_Temp_Table
exec sp_proc_first

--- Addition of the result from the second procedure
INSERT INTO #Dynamic_Temp_Table
exec sp_proc_second

--- result:  exec sp_proc_first UNION ALL exec sp_proc_second
select * from #Dynamic_Temp_Table
--- result: exec sp_proc_first UNION exec sp_proc_second
select DISTINCT * from #Dynamic_Temp_Table
票数 0
EN

Stack Overflow用户

发布于 2019-04-11 21:41:45

这是可能的,但一点也不容易……

您可以将存储过程更改为只创建和填充全局临时表(不使用select),然后可以使用联合选择这两个表。

要像在当前方法中那样使用OPENROWSET,您还需要全局临时表,但是当您提到存储过程正在使用临时表时,OPENROWSET、OPENQUERY或sys.dm_exec_describe_first_result_set将无法确定用于创建临时表的元数据。

另一种选择是将存储过程更改为使用变量表而不是临时表,然后可以重新确定元数据。@chrszcpl的答案https://stackoverflow.com/a/55632401/10932521是一个非常好的解决方案,如果你能够做到这一点的话。

如果这是不可能的(我假设这不是可能的,否则列将不会是未知的),因为您在过程中使用动态sql,或者您只是出于任何原因不能接触这些过程,我认为最便宜的解决方案是创建第三个存储过程,它返回其他过程将返回的动态列定义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55456891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档