考虑以下sql
一个名为myProc的存储过程,它返回两个结果集.结果集1返回column1,column2.结果集2返回第3列第4列第5列.
以下sql将失败,因为临时表仅定义了2个int列.
Create Table #temp1(
Column1 int,
Column2 int)
insert into #temp1 exec myProc
Run Code Online (Sandbox Code Playgroud)
我的问题是是否可以将第一个结果集插入#temp1?
生成和访问固定列布局的数据很容易.您可以预先创建本地临时表,并通过调用存储过程来填充它们.
另一方面,如果要生成具有动态列布局的数据,则通常必须动态构建SQL语句并使用"exec sp_executesql"执行它.由于数据布局在运行时是未知的,因此您无法在前面创建临时表,并且一旦在"exec sp_executesql"语句中,在那里创建的任何临时表都绑定到该范围并在调用返回时消失,因此访问数据要困难得多(即您的选择更加有限).
我有一个查询需要访问动态生成的表中的数据.
由一个存储过程,其动态地构建的查询生成的表,它在一个变量"@sql为nvarchar(最大)"存储,并通过调用"EXEC sp_executesql的@statement = @sql"运行它.
@sql语句类似于"select*into #temptable from ...",但#temptable在"exec sp_executesql"返回时被销毁.对此的快速解决方法是仅使用"## temptable"(即全局临时表),因为它在存储过程返回时仍然存在并且我可以在调用范围中轻松访问它(因为它具有已知/静态名称) ).
我不喜欢这个解决方案,因为全局临时表不是线程安全的(名称冲突),我不想乱用动态生成的唯一名称,因为我最终不得不使用更多动态SQL来访问它们......这使我回到正方形,使数据在SP外部无法访问.
我不认为返回表变量(通过输出参数)是一个选项(对SQL Server 2008也是新的),除非可以在不必定义静态表类型的情况下完成.我的存储过程生成的表是动态的,并且取决于传递的输入参数.
内联表值函数是不是一种选择,因为我运行的代码循环来构建@sql查询和调用"EXEC sp_executesql的".
多语句表值函数(而不是存储过程)也不是一个选项,因为这样的函数必须有一个明确定义的表格式,而我正在运行dyanmic SQL来返回一个变量数量为列和列名称取决于输入参数值.
我真正想做的就是将动态查询的结果集选择到一个新表中,但我发现它很难,因为以上都没有; 特别令人恼火的是本地临时表不是会话本地的,而是存储过程的本地临时表,以便它们在返回时消失.我见过的唯一解决方案坚持认为使用OPENROWSET是唯一的方法,但我不想弄乱我的存储过程中的连接字符串,出于同样的原因我不想包含唯一名称管理代码. ..它应该比它应该的更复杂.
总之,我只想执行生成未知格式数据集的动态SQL,并能够从调用范围轻松访问它.
我是T-SQL的新手.我有一个选择记录的存储过程.我想查询存储过程返回的记录,所以我试图将记录插入临时表.(Stack Overflow帖子和其他帖子说这是怎么做的.)
但是当我尝试时,我得到错误:
对象或列名称缺失或为空
当我只运行存储过程时,我得到一个包含名称列的表.
select * into #temp1
exec alexander.dbo.get_uberrecords '20120101', '20120201', 'labcorp' //throws error saying columns must have names
Run Code Online (Sandbox Code Playgroud)
但
exec alexander.dbo.get_uberrecords '20120101', '20120201', 'labcorp' // Returns cols with names
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
我有一个Test_Sp
以这种方式返回数据的存储过程:
Id Name Age Address State Country
1 ManiS 25 aaaa bbb ccc
Run Code Online (Sandbox Code Playgroud)
这个存储过程返回6列数据,但我想只将前2列插入临时表.
我的临时表变量是:
Declare @testTbl Table (RowId int identity, Name nvarchar(100), Age int);
INSERT INTO @testTbl(Name,Age) EXEC [Test_Sp] 23;
Select * from @testTbl;
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
消息50000,级别16,状态0,过程Test_Sp,行16
无法在INSERT-EXEC语句中使用ROLLBACK语句.
我知道Select * into
&如果我创建一个临时表与存储过程输出相同的列意味着它将工作..
我的问题:是否可以根据参数从存储过程输出中仅将两列插入临时表变量中?
我在我的开发PC上安装了SQL Server 2012完整版.
我试图按照这里的示例进行操作,其中显示了如何使用存储过程作为数据源创建新的临时表.我试图将几个存储过程的结果合并到一个临时表中(各种结果集的列结构/定义是相同的).
要测试管道是否正常工作,我发出以下查询:
SELECT * FROM OPENQUERY("FOO\SQL2012", 'exec mySchema.myStoredProc')
Run Code Online (Sandbox Code Playgroud)
但是我从这个简单的测试管道选择查询中得到了这个错误:
消息11526,级别16,状态1,过程sp_describe_first_result_set,第1行
无法确定元数据,因为语句'insert #tmp(foo1,foo2,foo3)选择'O'作为foo1,foo2,foo3'在过程'myStoredProc'中使用临时表.
如果我正确理解错误,OPENQUERY依赖于服务器能够从数据库中的持久定义中提取列数据类型,并且在我的存储过程中实例化的临时表是短暂的,缺少持久定义.如果是这种情况,是否有任何设置告诉OPENQUERY尽其所能并尝试对列数据类型进行智能猜测?
这是我正在测试的虚拟SP:
create proc testproc
as
begin
create table #test
(id int, name varchar(5) );
insert into #test(id,name)values(1,'xxx');
select * from #test;
--drop table #test; -- tried dropping and not dropping, same error either way
end
Run Code Online (Sandbox Code Playgroud) 我能否将存储的proc调用到CTE中。我登录到仅RO的报告数据库。我对我们的UAT具有写权限,但想查询实时数据。
那么我可以在CTE中使用存储的proc吗?
with clientOwes as (
exec des_Batch_GetApplicationClientOwesList
)
select a.des_applicationnumber
from des_heapplicationset a
where a.des_heapplicationid in (select applicationid from clientowes)
Run Code Online (Sandbox Code Playgroud)
结果是:消息156,级别15,状态1,第3行关键字'exec'附近的语法错误。
有人知道从存储过程结果集创建表定义的方法吗?
我有一个存储过程,它生成包含 30 多个列的结果集,我想将其放入表中,而无需手动创建所有表列。
是否有一个内置过程可以转储列名称和类型..?
谢谢。
我有一个名为proc_item的存储过程,它从不同的表中获取数据(使用join).我希望在另一个名为Item的表中插入存储过程的结果集(如果数据是新的)或更新(如果数据已存在).任何人都可以告诉我如何做到这一点?我是sql,存储过程和循环的新手.
谢谢
我有一个存储过程返回两个选择,我在报告中使用.第一个选择是以表格格式显示的数据,第二个选择是要在报告头中显示的元数据,如下所示:
CREATE PROCEDURE dbo. GetReport
@Input INT
AS
BEGIN
--Get #Metadata
-- #Results = f(#Metadata) … compex calculation
SELECT * FROM #Results
SELECT * FROM #Metadata
END
Run Code Online (Sandbox Code Playgroud)
由于sproc计算非常密集,我想将报告行准备为普通数据(在两个表中:PrecalcResults和PrecalcMetadata),以便在一夜之间使用一些主要使用的sproc参数.Lather我会直接选择预先计算的vaues或根据参数用sproc计算它们.
出于维护原因,我想使用相同的sproc来计算以下数据:1.在报告中显示2.存储在PrecalcResults和PrecalcMetadata中(使用的参数)
如果我有单一选择sproc,我会在这里解决方法: 将存储过程的结果插入临时表
因为我有多选sproc我想做上面的事情,但有两个表.在.net我会做DataSet.Tables [0]和DataSet.Tables [1] ...,但我想在tsql中做,在日常工作中运行它.
这在MS SQL中甚至可能吗?
我必须自己道歉,从下面的答案我可以看出我不是很清楚.我想将此功能实现为纯TSQL.
我有一个存储过程,结果如下:
Governors AUTO 07313570121 1 3.69 2.01 2.01 1.68 83.58%
Governors AUTO 07319354850 1 2.79 1.8 1.80 0.99 55.00%
Governors AUTO 07480400400 1 17.69 9.71 9.7117 7.9783 82.15%
Governors AUTO 07723100038 1 2.89 1.55 1.55 1.34 86.45%
Governors BEER 01820000031 6 4.69 23.34 3.888 0.8 20.57%
Governors BEER 01820000051 6 4.69 23.34 3.888 0.802 20.63%
Governors BEER 01820000106 1 6.39 4.93 4.93 1.46 29.61%
Run Code Online (Sandbox Code Playgroud)
我想总结一下:
Governors AUTO 4 27.06 15.07
Governors AUTO 13 13.07 51.61
Run Code Online (Sandbox Code Playgroud) sql ×5
t-sql ×5
sql-server ×3
dynamic-data ×1
loops ×1
metadata ×1
openquery ×1
scope ×1
temp-tables ×1