这是我的mssql UDT
create type ConditionUDT as Table
(
Name varchar(150),
PackageId int
);
这是我的mssql存储过程
create Procedure [dbo].[Condition_insert]
@terms_conditions ConditionUDT readonly
as
begin
insert into dbo.condition (name, p_id)
select [Name],[PackageId]
from @terms_conditions;
end
答案 0 :(得分:0)
Larnu可能是这样,MySQL根本不支持用户定义的类型,更不用说用户定义的表类型了。
您必须将它们全部设置为单独的标量参数。
答案 1 :(得分:0)
如果您别无选择,但肯定会从 sql server 迁移到 mysql,则有一个变通的解决方案。
在 mysql 中具有多行的最接近的结构预定义对象是实际表。所以你需要每个 sql server 的 UDDT 1 个表。确保您使用特定的架构或命名转换,以便您知道这些表是 UDDT 模拟。
这个想法是填写信息,使用它们进入sp然后删除它们。然而,您需要保证谁阅读了哪些信息以及在使用、消费后删除的信息。所以:
对于任何需要 2 列的表,我建议始终将它们放在首位。那将是键和变量名。键可以是 char(38) 并使用 UUID() 获取唯一标识符。它也可以是 int 并使用 connectionid() 代替。但是,唯一标识符更好,因为它可以确保无论如何都不会有人使用未为他缩进的信息。变量名将是用于 sql server 参数的变量名,只是一个字符串。这样:
您知道从表名中使用的 UDDT 是什么。 您通过密钥知道您的流程的身份。 您知道名称中的“变量”。
因此,在您的应用程序代码中,您: 开始交易。 使用键和变量名将数据插入到正确的(UDDT 模拟器)表中 向存储过程提供键和变量名。您可以在同一个 sp 调用中对许多表类型参数使用相同的键。 存储过程现在可以像以前一样使用来自 UDDT 变量的信息,使用键和变量名作为过滤器来查询正确的 UDDT 模拟表。 删除你插入的数据 犯罪 捕获时回滚。
为简单起见,您的 sp 可以将数据读入临时表中,并且您不需要为此方面更改原始 sql server sp 中的一行代码。
事务到您的应用代码将帮助您确保无论出现什么问题,您的临时变量数据要么被删除,要么永远不会提交。