问题标签 [table-valued-parameters]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
9781 浏览

sql-server-2008 - Identity column in a table-valued parameter in procedure, how to define DataTable

Is it possible to pass a parameter of type "table" with a column of type "[int] IDENTITY(1,1)" to a procedure and execute this stored procedure with a DataTable object passed as the input parameter?

I get the following error: "INSERT into an identity column not allowed on table variables. The data for table-valued parameter \"@xxxxx\" doesn't conform to the table type of the parameter."

The only related comment I was able to find was "If you supply a value for an identity column in a table-valued parameter, you must issue the SET IDENTITY_INSERT statement for the session."

It seems that even though the PK was not set in the table parameter, it gets set automatically at some point. Where does that happen and how can it be avoided?

0 投票
1 回答
1061 浏览

sql - 使用 CASE 减少动态 SQL 是否使用“IN”

我正在转换我之前编写为字符串的存储过程,然后使用 BIT 参数决定是否附加某些 WHERE/ON 子句

这个 sp 传递了一些逗号分隔的字符串,然后一些动态 WHERE 子句如下:

在这种情况下,@pComma_Separated_List_A 类似于 '1,3,6,66,22' ...我想要包含的内容的列表。

现在我将这些从字符串更改为 TVP,所以我可以使用“真实”SQL,如 AND [FIELD_A] IN (SELECT [TVP_FIELD] FROM @pTVP_A)

当我这样做时,我不喜欢字符串构建方法

但是,我也不喜欢嵌套 IF 语句。

我添加的参数越多,它就越复杂:

我宁愿做的是这样的:

我知道它忽略了所选“IF”结果之外的 SQL,但是所有重复的语句似乎很草率

0 投票
2 回答
2799 浏览

asp.net - 如何设置 ASP.NET SQL 数据源以接受 TVP

在代码隐藏中,您可以将 TVP 添加为存储过程的 SqlDbType.Structured 但这在 ASP.NET SqlDataSource 控件中不存在。

我已经将我的数据表存储在会话变量中(不要担心它们很小!),我需要将它们作为参数传递给 SqlDataSource(它有许多数据绑定对象)

我将数据源指向会话变量,但在转换为表类型时失败。

编辑:假设我将 Session 变量排除在等式之外(因为,真的,它完全是切线的)

必须有一种方法可以将 DBType.Structured 附加到 SQLDataSource。我的 Listview 是适当的数据绑定,但它们所附加的存储过程必须采用 TVP

我不敢相信没有办法为 SQLDataSource 发送 TVP 参数?我的替代方案是什么?

EDIT2:我一直在研究为 SqlDataSource 创建一个自定义参数,但在我看来,它的“eval”方法仍然对结构化数据类型不满意

EDIT3:开始出现我唯一的选择是在代码隐藏中为我的数据绑定控件完成所有工作。我添加了一个赏金,以防其他人有一个优雅的解决方案。

EDIT4:也许有一种方法可以将表作为对象传递给存储过程,然后让 SQL Server 将其转换为 TVP?

0 投票
1 回答
2912 浏览

c# - 使用数据行列表存储数据

我在两个类之间有一个主从关系。大师班将包含许多细节的列表。目前我正在使用

大师班里面。在保存此类时,我需要在将详细信息列表传递给 sp 之前使用数据表。(因为我们在 sql2008 中使用表值参数)。使用 tvp 的原因是 1 个 master 可以包含超过 10k 的详细信息,并且 tvp 是一种非常有效的方式,可以非常快速地将所有这些信息转储到数据库中。

问:当我将列表转换为数据表以进行数据库插入时,相同数据的内存使用量会增加一倍。除了直接使用数据表之外,还有更好的方法将详细信息保存在 master 中吗?

问:我的下一个选项是尝试使用列表详细信息,并执行 datatable.ImportRow(row)。但我不知道,如何在没有定义任何列的情况下将数据添加到行中。我也不知道任何外部对象如何访问此类列表中的各个详细信息字段。


按照casperOne 的回答,我使用了该IEnumerable<SqldataRecord>方法,并且能够通过流式传输插入数据,而无需在内存中创建额外的数据表。为了帮助其他寻找类似解决方案的人,我在下面发布代码。

0 投票
4 回答
20970 浏览

.net - 将空列表或空值绑定到存储过程 (.NET) 上的表值参数

我创建了一个存储过程,它采用表值参数,该参数是具有单列类型的表int。这个想法是简单地将 id 列表传递给存储过程,并允许存储过程处理数据。但是,在没有数据传入的情况下,我遇到了问题(当我有数据时事情正常)。我正在将 a 转换为 a List<int>IEnumerable<SqlDataRecord>并将其绑定到存储过程的表值参数。我试图绑定一个空的List<SqlDataRecord>,这导致了错误:

System.ArgumentException:SqlDataRecord 枚举中没有记录。要发送不带行的表值参数,请改用空值引用。

然后我尝试绑定一个空值(我认为这是上面的消息所得到的),但这只会导致不同的错误消息

System.NotSupportedException:不支持参数“@MainItemIdList”的 DBNull 值。表值参数不能为 DBNull。

您似乎不能在存储过程声明中将表值参数声明为可为空。将空列表绑定到表值参数的正确方法是什么?

0 投票
4 回答
11179 浏览

sql-server - 是否可以使用 SqlDbType.Structured 在 NHibernate 中传递表值参数?

我想将一组 id 传递给将使用 NHibernate 映射的存储过程。这种技术是在 Sql Server 2008 中引入的(更多信息在这里 =>表值参数)。我只是不想在一个nvarchar参数中传递多个 id,然后在 SQL Server 端砍掉它的值。

0 投票
1 回答
344 浏览

vb.net - Table Value Parameter missing data table data

I'm new to TVP in SQL Server and trying to understand the basics. I created a sample TVP in the Northwind database in SQL Express. My code from VB.NET is fairly simple (see below). The TVP parameter is empty in the procedure. I've tested the TVP in SQL Server and it works fine. Any ideas? Does SQL Express fully support table value parameters?

0 投票
1 回答
1130 浏览

sql - 创建一个以 SQL @tables 作为其成员的 UDT

我想知道是否可以在 SQL Server 2008 中创建一个 CLR 用户定义类型,其成员将是表变量。

你知道,你可以声明一个表变量:

所以我喜欢一个有几个成员的 UDT,每个成员都是以这种方式定义的表(当然是不同的表),所以可以说:

或者

我确实有一种感觉,我想要太多了,但似乎无法在互联网上找到明确的“是”或“否”。
有可能吗?

0 投票
2 回答
1639 浏览

sql - 我的查询过滤没有按我想要的方式工作

我有 3 种过滤方式:

  1. 按名字
  2. 按列表
  3. 并显示所有

我正在使用 ASP.NET 3.5 和 SQL Server 2008。使用 ADO.NET 和存储过程。

我将列表作为表值参数传递(但我正在使用表变量进行测试)并将名称作为 nvarchar 传递。我将“全部显示”为 ISNULL(@var, column) = column。显然,我查询这个的方式没有利用短路或我对 WHERE 子句如何工作的理解缺乏。发生的情况是,如果我创建 @var = 'some string' 并将 null 插入到表变量中,那么它会正确过滤。如果我让@var = null 并将“一些字符串”插入到表变量中,那么我会得到每条记录,我应该得到“一些字符串”。

编码:

这就是我想出的。虽然很丑……

好的。我想我明白了。我删除了@resp1,因为它不是必需的,我只是使用表值参数@usersTable(但这里我使用表变量进行测试)。我添加了一个标志@filterPick,因此我可以只显示@usersTable 或answers.taskAction = 1 的每条记录中的值。

编码:

0 投票
0 回答
709 浏览

c# - 表值参数中的 ADO.NET XML 类型列

这实际上不是一个问题,这是一个我找不到任何帮助的问题,所以我想我会发布我最终找到的解决方案,以防其他人遇到它。

问题在于我传递给 SQL Server 2008 存储过程的 TVP 参数中的 XML 类型列。当我调用 ExecuteNonQuery() 时,我收到一个错误,就像

附加信息:XML解析:(行号等等)无法切换编码(等等)

这是因为 XML 像往常一样,被指定为 UTF-8

<?xml 版本="1.0" 编码="UTF-8" ?>

但 .NET 中的字符串是 UTF-16。解决方案是将带有 XML 的列声明为 DataTable 中的字节数组:

然后在添加行时获取 UTF-8 字节:

ADO.NET 引擎知道如何将字节转换为 XML。希望对某人有所帮助!