我在SQL Server中创建了用户定义的表类型:
CREATE TYPE dbo.TestType AS TABLE
(
ColumnA int,
ColumnB nvarchar(500)
)
我正在使用存储过程将记录插入数据库中:
create procedure [dbo].[sp_Test_CustomType]
@testing TestType READONLY
as
insert into [dbo].[myTable]
select ColumnA, ColumnB
from @testing
而且我想使用EF执行此存储过程,但这是问题所在:如何将用户定义的表传递给存储过程?
我尝试将存储过程添加到模型中,但是无法在更新的上下文中找到所需的存储过程。
我要执行的操作是对表执行批量插入,这是我当前正在使用的方法:
List<items> itemToInsertToDB = //fetchItems;
foreach(items i in itemToInsertToDB)
{
context.sp_InsertToTable(i.ColumnA, i.ColumnB)
}
当前,我使用foreach
循环在列表中循环以将项目插入DB,但是如果列表中有很多项目,则将存在性能问题,因此,我正在考虑将列表传递给存储过程,并在里面做插入。
那么如何解决这个问题呢?还是有更好的方法来做到这一点?
假设您要发送一个包含一列GUID的表。
首先,我们需要使用SqlMetaData创建一个结构,该结构表示表的模式(列)。
var tableSchema = new List<SqlMetaData>(1)
{
new SqlMetaData("Id", SqlDbType.UniqueIdentifier)
}.ToArray();
接下来,使用SqlDataRecord创建与模式匹配的记录列表。
var tableRow = new SqlDataRecord(tableSchema);
tableRow.SetGuid(0, Guid.NewGuid());
var table = new List<SqlDataRecord>(1)
{
tableRow
};
然后创建SqlParameter:
var parameter = new SqlParameter();
parameter.SqlDbType = SqlDbType.Structured;
parameter.ParameterName = "@UserIds";
parameter.Value = table;
var parameters = new SqlParameter[1]
{
parameter
};
然后,只需使用Database.SqlQuery调用存储过程。
IEnumerable<ReturnType> result;
using (var myContext = new DbContext())
{
result = myContext.Database.SqlQuery<User>("GetUsers", parameters)
.ToList(); // calls the stored procedure
// ToListAsync(); // Async
{
在SQL Server中,创建用户定义的表类型(我在它们的后缀TTV,表类型值):
CREATE TYPE [dbo].[UniqueidentifiersTTV] AS TABLE(
[Id] [uniqueidentifier] NOT NULL
)
GO
然后将类型指定为参数(别忘了,表类型值必须是只读的!):
CREATE PROCEDURE [dbo].[GetUsers] (
@UserIds [UniqueidentifiersTTV] READONLY
) AS
BEGIN
SET NOCOUNT ON
SELECT u.* -- Just an example :P
FROM [dbo].[Users] u
INNER JOIN @UserIds ids On u.Id = ids.Id
END
问题内容: 我在形成文字时可能做错了。假设我有一个简单的存储过程,如下所示: 的定义为: 执行这样的查询: 产生以下结果集: 代替: 我的文字是否有问题,还是应该以其他方式访问该字段?感谢您的任何建议。 问题答案: 指定输入的方式看起来不错,因为使用行和数组构造器语法可以观察到相同的行为: 和: 产生: 如果添加: 在循环内部,输出为: 表明您实际上正在获取一个元组,其中“ message”是您期
问题内容: 我有一个形式的SQL存储过程 我想向过程传递一个参数(@whereSql),该参数指定整个WHERE子句,但返回以下错误: 能做到吗? 问题答案: 简短的答案是您不能这样做-SQL Server将变量的内容视为VALUE。它不会动态构建要执行的字符串(这就是为什么这是避免SQL注入攻击的 正确 方法)的原因。 您应该尽一切努力避免动态的WHERE,主要是因为这个原因,也是为了提高效率。
我在HANA数据库中创建了这个存储过程,它使用两个参数,一个是表类型,另一个是。 现在我想在Java中调用这个过程,我写了这样的东西。 有人能告诉我在调用此存储过程时,如何将对象作为参数中的表实体传递吗?
因此,在这里我将basePackages硬编码为“com.example”。这不是我想要的。我想通过命令行参数从终端运行应用程序时接收包名。有没有一种方法可以将命令行参数传递给应用程序,并使用我在BasePackages中接收到的参数?提前致谢
问题内容: 以下代码使快速(3,3.1,4)编译器崩溃: 我可能天真地希望编译器将其推断为具有签名的Function Type ,之后,我可以这样称呼它: 我想我的问题是:显然,编译器应该执行除崩溃以外的其他操作,但是Swift目前应该支持这种语法吗? 问题答案: 如您所说,编译器永远不会崩溃;这确实是一个错误,已在此处提交。Swift团队成员Slava Pestov在其中说: 我们计划使MyPr