标签: table-valued-parameters

存储过程和实体框架4.0中的表值参数

我在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

8
推荐指数
1
解决办法
7478
查看次数

DataTable,byte []字段作为存储过程的参数

我一直在重用这种使用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函数运行此查询.

如何修改我的工作原理?

.net c# datatable table-valued-parameters

8
推荐指数
1
解决办法
8664
查看次数

使用PetaPoco将表值param传递给存储过程

因为我试图使用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

8
推荐指数
1
解决办法
6876
查看次数

使用robconery/massive访问存储过程?

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

7
推荐指数
1
解决办法
1606
查看次数

使用SQL Server表值参数(TVP)作为存储过程参数需要什么权限?

我正在使用SQL Server 2008 R2并且我创建了一个TVP,我想将其用作存储过程的参数,但是我收到一条消息,说它无法找到或者我没有权限.

我可以在脚本中或在存储过程的主体中使用TVP,但是当我尝试将其用作参数时,我得到了错误.

有什么想法吗?

编辑:为了澄清,我得到的错误是创建存储过程

sql sql-server permissions sql-server-2008 table-valued-parameters

7
推荐指数
1
解决办法
3420
查看次数

如何在EF6查询中使用TVP?(不是存储过程)

我在具有复杂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

7
推荐指数
0
解决办法
99
查看次数

mysql存储过程中表值参数的替代解决方案

是否有人可能在MYSQL中找到了具有表值参数的替代解决方案.我的情况是我想从一个可视化的基本前端应用程序传递多行,而Id喜欢能够在一个请求中发送一个记录表,所以我可以将它包装在一个事务中.我做了很多研究,仍然没有答案.也许有人可以帮助我.

mysql vb.net table-valued-parameters

6
推荐指数
0
解决办法
2122
查看次数

在单行中创建并传递表值参数

使用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)

sql-server stored-procedures table-valued-parameters

6
推荐指数
1
解决办法
3278
查看次数

表值参数的排序顺序是否保证保持不变?

我需要知道我是否需要在我的自定义表类型中添加一个排序列,然后我可以使用它来进行排序,或者如果我可以相信即使没有这样的列,参数的顺序也保持不变.

这是我的类型:

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

6
推荐指数
1
解决办法
578
查看次数

将表作为输入参数传递给dotnet核心中的dapper

在尝试通过Dapper将表作为参数传递给存储过程时,我遇到了这个SO答案,这表明它在Dapper中直接受支持.

但是在dotnet核心中,DataTable似乎没有实现,所以这不起作用.

是否有另一种简单的方法可以使用Dapper将自定义/用户定义的表作为参数传递给存储过程?

c# table-valued-parameters dapper .net-core

6
推荐指数
1
解决办法
4993
查看次数