我需要创建一个具有相同列和类型的临时表作为永久表.最好的方法是什么?(永久表有超过100列)
即
通常我会像这样创建表格.
DECLARE #TT TABLE(
member_id INT,
reason varchar(1),
record_status varchar(1) ,
record_type varchar(1)
)
Run Code Online (Sandbox Code Playgroud)
但有没有办法在不提及列名和类型的情况下执行此操作,但是提及具有所需列的另一个表的名称?
代码如下:
ALTER PROCEDURE dbo.pdpd_DynamicCall
@SQLString varchar(4096) = null
AS
Begin
create TABLE #T1 ( column_1 varchar(10) , column_2 varchar(100) )
insert into #T1
execute ('execute ' + @SQLString )
select * from #T1
End
Run Code Online (Sandbox Code Playgroud)
问题是我想调用可以返回不同列的不同过程.因此,我必须一般地定义表#T1.但我不知道怎么做.
任何人都可以帮我解决这个问题吗?
可能重复:
检索存储过程结果集的列定义
我使用以下SQL来获取表或视图的列名和类型:
DECLARE @viewname varchar (250);
select a.name as colname,b.name as typename
from syscolumns a, systypes b -- GAH!
where a.id = object_id(@viewname)
and a.xtype=b.xtype
and b.name <> 'sysname'
Run Code Online (Sandbox Code Playgroud)
如何为存储过程的输出列执行类似的操作?
简单地说,我有这个SQL语句:
EXEC xp_cmdshell 'tasklist'
Run Code Online (Sandbox Code Playgroud)
我们可以使用order by
或订购或过滤结果where
吗?
谢谢,
如何组合执行存储过程并在常规SQL查询中使用其结果或参数?
例如,我想做类似以下的事情:
-- passing result of SELECT to SP
SELECT a, b FROM t
EXEC my_sp a, b
-- passing result of SP to INSERT
INSERT INTO t
EXEC my_sp a, b
Run Code Online (Sandbox Code Playgroud)
等等
这与问题653714非常相似,但对于MySQL而不是SQL Server.
基本上,我有一个复杂的选择,这是几个存储过程的基础.我想在存储过程中共享代码,但是,我不知道如何做到这一点.我可以这样做的一种方法是使共享选择一个存储过程,然后从其他存储过程调用该存储过程.我无法弄清楚如何使用嵌套存储过程的结果集.如果我可以将它们放在临时表中,我可以有效地使用结果,但我无法弄清楚如何在临时表中获取它们.例如,这不起作用:
CREATE TEMPORARY TABLE tmp EXEC nested_sp();
Run Code Online (Sandbox Code Playgroud) 我有一个嵌套的存储过程调用
在其中一个存储过程中,我想将结果保存到表变量中,如下所示:
INSERT INTO @myTable
EXEC sp_myStoredProcedure
Run Code Online (Sandbox Code Playgroud)
但是,因为proc.嵌套发生以下错误:INSERT EXEC语句不能嵌套
必须从另一个过程调用该过程,更改此选项不是一个选项.我想尝试使用输出参数,但仍然必须使用Insert into语句进行设置.
将从存储过程调用中检索到的数据保存到变量中的其他选项有哪些?
据我所知; 我想做的事情在sql中是不可能的,但值得问你们.
假设我有一个存储过程abc,它返回列Id和Value.由于功能原因,此存储过程主要由其他部门使用,我将不时地使用它来进行数据检查.
所以使用它作为我的存储过程的一部分:
DECLARE @tABC TABLE
(
ID INT,
Value DECIMAL(12,2)
)
INSERT INTO @tABC
EXEC OtherDb.DataProd.abc
Run Code Online (Sandbox Code Playgroud)
Oky因此现在可以完美地工作,但是如果他们改变了存储过程的结构呢?
在存储过程中添加或删除列会破坏我的代码,因此有一种方法可以使我的代码更加灵活.
我最后一次绝望的尝试是这样的:
WITH tempTable AS
(
EXEC OtherDb.DataProd.abc
)
SELECT ID, Value FROM tempTable
Run Code Online (Sandbox Code Playgroud)
这显然是悲惨地失败了.
我有一个包含许多参数的存储过程.
我想插入(或者可能选择)这样:
INSERT INTO @TEMP_TABLE
EXECUTE STORED_PROCEDURE
Run Code Online (Sandbox Code Playgroud)
没有定义的架构@TEMP_TABLE
.
在过去的几天里,我通过互联网查找了类似的问题.我终于自己提出这个问题.
使用代码优先方法和EF 4.3.1,我创建了一个上下文类,实体类和类来存储存储过程输出.上下文类具有使用执行某些存储过程的方法SqlQuery<T>
.
例:
public IEnumerable<Results> GetData(int id)
{
var parameters = new SqlParameter[] { new SqlParameter("@id", id) };
var result = this.Database.SqlQuery<Result>("Exec dbo.sproc_GetData @id", parameters);
var data= result.ToList<Result>();
return data;
}
Run Code Online (Sandbox Code Playgroud)
当我跟踪调试时,我的数据又回来了,数据被映射到具有匹配名称的属性.但是,在输出中有一个"/"
名称中带有a的列(示例:) Info/Data
.显然我不能命名这样的属性所以我想我可以使用column属性([Column("Info/Data")]
)映射输出:
[Column("Info/Data")]
public string InfoData
{
get { return infoData; }
set { infoData= value; }
}
Run Code Online (Sandbox Code Playgroud)
我甚至尝试使用verbatim运算符([Column(@"Info/Data")]
),用[]
([Column("[Info/Data]")]
)包装文本,我尝试了两个([Column(@"[Info/Data]")]
).单步执行代码时,我看到分配了具有匹配列名的属性,但是在分配期间会忽略具有column属性的属性.
我还为实体的每一列尝试了fluent-api.
modelBuilder.ComplexType<Result>().Property(d => d.InfoData).HasColumnName("Info/Data");
Run Code Online (Sandbox Code Playgroud)
但是会抛出以下异常:
数据读取器与指定的"NameSpace.Result"不兼容.类型为"InfoData"的成员在数据读取器中没有具有相同名称的相应列.
在我的项目中NameSpace.Result
是一个类(名称已更改为安全性),并且InfoDatais
是我尝试使用fluent-api映射的属性(相应的sql列中包含/; ex:Info/Data).
有没有人遇到过这个问题?
如果我的问题不明确或者之前有人问过,请告诉我.