我在SQL Server 2008中有一个名为"GetPrices"的存储过程,其中有一个名为"StoreIDs"的表值参数.
这是我为这个TVP创建的类型:
CREATE TYPE integer_list_tbltype AS TABLE (n int)
Run Code Online (Sandbox Code Playgroud)
我想从我的实体框架中调用SP.但是当我尝试将存储过程添加到EDM时,我收到以下错误:
函数'GetPrices'在参数索引2处具有参数'StoreIDs',其具有不受支持的数据类型'表类型'.该功能被排除在外.
这有什么解决方法吗?有什么想法吗?
法比奥
sql-server stored-procedures sql-server-2008 table-valued-parameters entity-framework-4
我一直在重用这种使用DataTable作为存储过程参数的方法,它一直很好用.这是简化的工作代码:
using (dbEntities dbe = new dbEntities())
{
var dt = new dataTable();
dt.Columns.Add("ID");
dt.Columns.Add("Message");
dt.Columns.Add("CreatedOn", typeof(DateTime));
foreach (var row in randomDataSource)
{
dt.Rows.Add(
row.id,
row.message,
DateTime.Now
);
}
var tableType = new SqlParameter("tableType", SqlDbType.Structured);
tableType.Value = dt;
tableType.TypeName = "[dbo].[RandomTableType]";
dbe.ExecuteStoreCommand(
"EXEC [dbo].[SaveTable] @tableType",
new object[] { tableType }
);
}
Run Code Online (Sandbox Code Playgroud)
当我想要添加的字段是二进制类型时,会出现问题.即:
dt.Columns.Add("BinaryMessage", typeof(byte[]));
Run Code Online (Sandbox Code Playgroud)
varbinary(MAX)顺便提一下,数据库中的相应列.当我尝试运行它时,我收到此错误:
不允许从数据类型nvarchar(max)到varbinary(max)的隐式转换.使用CONVERT函数运行此查询.
如何修改我的工作原理?
因为我试图使用PetaPoco调用SQL Server 2008 R2存储过程.
我的存储过程接受表值参数.
如何使用表值param调用petapoco中的存储过程?
这是我想要做的:
var db = new PetaPoco.Database("repikaciskaBaza");
DataTable table = new DataTable();
DataColumn id = table.Columns.Add("id", type: typeof(Int32));
for (int i = 0; i < 10;i++ )
{
DataRow row = table.NewRow();
row["id"] = i;
table.Rows.Add(row);
}
var param = new SqlParameter();
param.DbType = DbType.Object;
param.ParameterName = "@art_id";
param.SqlValue = table;
var lista = db.Query<pocoArts>(";exec dbo.test_sporc_param @0", param);
Run Code Online (Sandbox Code Playgroud)
这段代码给了我一个例外:
传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确.
参数3("@ 0"):数据类型0x62(sql_variant)具有类型特定元数据的无效类型.
如果我设置了parametar ty值
param.SqlDbType = SqlDbType.Structured;
Run Code Online (Sandbox Code Playgroud)
然后我得到例外
The table type parameter '@0' must have …Run Code Online (Sandbox Code Playgroud) stored-procedures table-valued-parameters sql-server-2008-r2 c#-4.0 petapoco
Rob对Massive ORM的另一篇精彩文章.我无法找到的是有关如何访问存储过程的参考. SubSonic在使用ActiveRecords时遇到了一些问题,所以我更喜欢使用存储过程进行数据访问,仍然使用SubSonic ORM.
我还没有看到的是对ORM中的SQL Server TVP的直接支持,所以我 修改了SubSonic(无耻插件)来支持它们.
是否可以使用Massive访问SQL Server sprocs.其次,是否有TVP支持?
stored-procedures sql-server-2008 table-valued-parameters subsonic2.2 massive
我正在使用SQL Server 2008 R2并且我创建了一个TVP,我想将其用作存储过程的参数,但是我收到一条消息,说它无法找到或者我没有权限.
我可以在脚本中或在存储过程的主体中使用TVP,但是当我尝试将其用作参数时,我得到了错误.
有什么想法吗?
编辑:为了澄清,我得到的错误是创建存储过程
sql sql-server permissions sql-server-2008 table-valued-parameters
我在具有复杂EF6查询的Azure上遇到SQL性能问题.环境配置为弹性池.在开发区域,eDTU限制经常通过CPU使用率来命中,我将其归因于查询计划生成.
该应用程序相当通用,因此EF查询非常复杂,但在查询的内容中,通常有一个子查询通常具有IN子句.
SELECT Id FROM Event E WHERE E.Name IN (@p__linq__1, @p__linq__2, @p__linq__3)
Run Code Online (Sandbox Code Playgroud)
要么
SELECT Id FROM Event E WHERE E.Name IN (@p__linq__4, @p__linq__5)
Run Code Online (Sandbox Code Playgroud)
虽然查询的其余部分是相同的,但是会生成新的SQL查询计划,因为文本因参数的数量而不同.
以前,在另一个项目中,我通过在连接中使用TVP而不是where子句来增加计划重用.
SELECT Id FROM Event E INNER JOIN @p_tvp_strings T ON E.Name = T.[Value]
Run Code Online (Sandbox Code Playgroud)
我无法通过IQueryable方式解决如何在EF中执行此操作.
我已经尝试创建一个Datatable并解析它作为参数但context.Database.SqlQuery不返回IQueryable.它立即执行命令.
var nameArray = new string[]
{
"Bob", "Fred", "Bill",
};
var nameTable = CreateDataTable(nameArray);
var parameter = new SqlParameter("tvp", nameTable);
parameter.SqlDbType = SqlDbType.Structured;
parameter.TypeName = "StringSet";
var names = context.Database.SqlQuery<string>("SELECT [Value] FROM @tvp", parameter).AsQueryable();
var people = context.People.Where(p => …Run Code Online (Sandbox Code Playgroud) performance entity-framework table-valued-parameters sql-execution-plan azure-sql-database
是否有人可能在MYSQL中找到了具有表值参数的替代解决方案.我的情况是我想从一个可视化的基本前端应用程序传递多行,而Id喜欢能够在一个请求中发送一个记录表,所以我可以将它包装在一个事务中.我做了很多研究,仍然没有答案.也许有人可以帮助我.
使用SQL Server 2012,是否可以省略声明表值参数(TVP)只是为了将其传递给存储过程?下面是一个存储过程(SP)的一个非常简单的例子,它采用TVP和一个工作示例来执行该SP,我必须声明TVP,填充它然后将其传递给SP.我希望能够简单地将人口标准直接传递给EXEC电话.这可能吗?
场景设置:
-- Create a sample Users table
CREATE TABLE Users (UserID int, UserName varchar(20))
INSERT INTO Users VALUES (1, 'Bob'), (2, 'Mary'), (3, 'John'), (4, 'Mark')
-- Create a TVP Type
CREATE TYPE UserIdTableType AS TABLE (UserID int)
-- Create SP That Uses TVP Type
CREATE PROCEDURE GetUsers
@UserIdFilter UserIdTableType READONLY
AS
SELECT * FROM @UserIdFilter WHERE UserID > 2
Run Code Online (Sandbox Code Playgroud)
执行的工作方法:
DECLARE @MyIds AS UserIdTableType
INSERT INTO @MyIds SELECT UserID FROM Users
EXEC GetUsers @MyIds
Run Code Online (Sandbox Code Playgroud)
要求执行的方法:
EXEC …Run Code Online (Sandbox Code Playgroud) 我需要知道我是否需要在我的自定义表类型中添加一个排序列,然后我可以使用它来进行排序,或者如果我可以相信即使没有这样的列,参数的顺序也保持不变.
这是我的类型:
CREATE TYPE [dbo].[VwdCodeList] AS TABLE(
[VwdCode] [varchar](50) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
这是使用它的sql之一:
/// <summary>
/// Inserts all new WatchListCodes for a given watchlist
/// </summary>
public const string InsertWatchListCodes = @"
INSERT INTO [dbo].[WatchListCodes]
([WatchListID]
,[VwdCode]
,[Sort])
SELECT @WatchListID, VwdCode, ROW_NUMBER()OVER(ORDER BY (SELECT 1))
FROM @VwdCodeList;";
Run Code Online (Sandbox Code Playgroud)
正如你所看到我正在使用ROW_NUMBER获取sort-column值.
我是否还需要在表类型中添加排序列,还是保证(记录)它保持不变?它似乎工作.
这是我使用它的ADO.NET代码:
SqlParameter vwdCodeListParameter = insertWatchListCodeCommand.Parameters.Add("@VwdCodeList", SqlDbType.Structured);
vwdCodeListParameter.TypeName = "[dbo].[VwdCodeList]";
vwdCodeListParameter.Value = WatchListSql.GetVwdCodeRecords(newVwdCodes, true);
int inserted = insertWatchListCodeCommand.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
GetVwdCodeRecords返回IEnumerable<SqlDataRecord>一个IEnumerable<string>.
谢谢大家.如果未来的读者有兴趣知道我如何保证排序顺序.我通过添加另一列修改了表格类型:
CREATE TYPE [dbo].[VwdCodeList] AS TABLE( …Run Code Online (Sandbox Code Playgroud) c# sql-server ado.net table-valued-parameters sql-server-2014
在尝试通过Dapper将表作为参数传递给存储过程时,我遇到了这个SO答案,这表明它在Dapper中直接受支持.
但是在dotnet核心中,DataTable似乎没有实现,所以这不起作用.
是否有另一种简单的方法可以使用Dapper将自定义/用户定义的表作为参数传递给存储过程?
sql-server ×4
c# ×3
.net ×1
.net-core ×1
ado.net ×1
c#-4.0 ×1
dapper ×1
datatable ×1
massive ×1
mysql ×1
performance ×1
permissions ×1
petapoco ×1
sql ×1
subsonic2.2 ×1
vb.net ×1