【问题标题】:calling a synonym of a procedure where input parameter is user-defined table type调用输入参数为用户定义表类型的过程的同义词
【发布时间】:2017-06-08 20:13:40
【问题描述】:

在 DatabaseA 上,我有用户定义的数据类型,用作存储过程中的输入参数。在另一个数据库 (DatabaseB) 上,我正在创建此过程的同义词,并在那里创建相同的数据类型。

当我调用 sysnonym 时,我收到一个错误“操作数类型冲突:Ids 与 Ids 不兼容”

有什么建议可以解决这个问题吗?

use DatabaseA
go

CREATE TYPE [dbo].[Ids] AS TABLE(
    [Id] [sql_variant] NULL
)
GO

create procedure dbo.proc1 @Ids [Ids] readonly
as
begin
    select *
    from @Ids;
end


declare @Ids  dbo.Ids;
insert into @Ids values (1),(2)
exec dbo.proc1
    @Ids = @Ids 

use DatabaseB

CREATE TYPE [dbo].[Ids] AS TABLE(
    [Id] [sql_variant] NULL
)
go

CREATE SYNONYM [Admiral_CentralSystem01].[dbo_proc1] FOR [Admiral_CentralSystem01].[dbo].[proc1]
GO

declare @Ids  dbo.Ids;
insert into @Ids values (1),(2)
exec [Admiral_CentralSystem01].[dbo_proc1]
    @Ids = @Ids 

【问题讨论】:

  • 你到底需要做什么?
  • B.dbo.Ids 不是A.dbo.Ids,即使它们恰好在结构上相同。您也不能为该类型创建同义词(好吧,您可以,但它不起作用)。您根本无法在另一个使用 TVP 的数据库中调用存储过程,因为您无法声明适当类型的参数。几乎可以肯定有替代方法可以实现您想要的,这取决于它是什么。

标签: sql-server


【解决方案1】:

您不能将表变量作为参数传递到另一个数据库中。 使用 XPath 的 XML 变量可以解决您的问题

【讨论】:

    【解决方案2】:

    基本上表变体是数据库范围的

    为了在 Microsoft SQL Server 中使用用户定义类型 (UDT),您 必须注册它。注册 UDT 涉及注册程序集 并在您希望使用它的数据库中创建类型。 UDT 的范围仅限于单个数据库,不能在多个数据库中使用 数据库,除非注册了相同的程序集和 UDT 每个数据库。一旦注册了 UDT 程序集并且类型 创建后,您可以在 Transact-SQL 和客户端代码中使用 UDT。为了 更多信息,请参阅 CLR 用户定义类型。

    https://docs.microsoft.com/en-us/sql/relational-databases/clr-integration-database-objects-user-defined-types/registering-user-defined-types-in-sql-server

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多