在 SQL Server 上使用用户定义的表类型的操作数类型冲突

Posted

技术标签:

【中文标题】在 SQL Server 上使用用户定义的表类型的操作数类型冲突【英文标题】:Operand type *** using user defined table type on SQL Server 【发布时间】:2013-04-15 14:59:53 【问题描述】:

我创建了一个用户定义的类型(带有 CREATE 的脚本),如下所示:

CREATE TYPE [dbo].[udt_ProductID_SellingPrice] AS TABLE(
    [Product_Id] [int] NOT NULL,
    [Selling_Price] [money] NULL,
    PRIMARY KEY CLUSTERED 
(
    [Product_Id] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)

在同一个数据库上,我创建了一个使用这种类型的函数:

CREATE FUNCTION [dbo].[fn_NetGP_tbl](@InputSKUs udt_ProductID_SellingPrice READONLY, @Currency VARCHAR(3), @SiteName VARCHAR(255), @CatalogueSite VARCHAR(5), @SiteGroup VARCHAR(255))
RETURNS @Results TABLE
(
   Product_Id INT NOT NULL,
   Selling_Price MONEY NULL,
   Net_GP MONEY NULL
)
AS
BEGIN

我将输入 SKU 声明为内存表,如下所示并调用函数:

DECLARE @InputSKUs dbo.udt_ProductId_SellingPrice

INSERT INTO @InputSKUs VALUES(10352316, 500.00)

SELECT * FROM Sensu_Staging.dbo.fn_NetGP_tbl(@InputSKUs, 'GBP', 'Site_Name', 'SITE', 'Site_Group')

并得到(我发现的,相当混乱的)错误消息:

操作数类型冲突:udt_ProductID_SellingPrice 与 udt_ProductID_SellingPrice 不兼容

我无法真正弄清楚我做错了什么 - 这在以前的数据库上有效,我所做的唯一更改是向 ProductID_SellingPrice 类型添加主键/聚集索引,这似乎已经把所有事情都搞砸了.

我需要更改功能吗?还是不能在内存中的自定义表类型上创建索引?我们希望通过索引该表来加快进程,但如果不可能,那么我想我们将不得不寻找其他方法。

干杯,

马特

【问题讨论】:

你能添加函数体的相关部分吗(例如你如何引用@InputSKUs)? 已经对其进行了排序并使其正常工作 - 我仍然在函数体中引用了以前的(非主键)用户定义类型(具有相同名称),因此出现了相当混乱的错误留言! 【参考方案1】:

我之前在不同的数据库中定义了用户数据类型,并在我正在调用的函数(本例中为 Net GP 函数)中明确引用了它。

然后我更改了数据类型以包含一个主键(两者都具有相同的名称),但仍在我的函数主体中引用以前的数据类型,因此出现了令人困惑但完全准确的错误消息。

简而言之,请确保您更改函数中所有点的所有引用,或者更明智地调用不同的数据类型,以便能够更好地解决此问题!

【讨论】:

如果您在更改基础类型后对所有函数运行sp_refreshsqlmodule 会有帮助吗?您也可以通过创建函数WITH SCHEMABINDING 来避免将来出现此问题 - 如果不更改函数,您将无法更改类型。

以上是关于在 SQL Server 上使用用户定义的表类型的操作数类型冲突的主要内容,如果未能解决你的问题,请参考以下文章

使用 JDBC 将用户定义的表类型传递给 SQL Server 存储过程

使用 JDBC 将用户定义的表类型传递给 SQL Server 存储过程

SQL Server:关于用户定义的表类型的 ltrim

SQL Server中用户定义的表类型的性能

在 SQL Server Management Studio 中使用执行过程 - 如何格式化用户定义的表类型的值?

在 SQL Server 数据库之间传递用户定义的表类型