我有两个存储过程,它们返回相同但未知的列。我需要编写一个proc来组合这两个存储过程的结果。我尝试过OPENROWSET,但问题是在OPENROWSET函数中提供连接字符串,即使我指定了一次连接字符串,它在不同的环境下会有所不同,我认为每次在不同的环境中部署应用程序或在服务器上更改用户时更改连接字符串都是最糟糕的事情。有人能帮我以最好的方式完成这件事吗?
我不能把它们写成函数,因为procs正在使用临时表。
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)发布于 2019-04-11 20:21:13
--- 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发布于 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,或者您只是出于任何原因不能接触这些过程,我认为最便宜的解决方案是创建第三个存储过程,它返回其他过程将返回的动态列定义。
https://stackoverflow.com/questions/55456891
复制相似问题