如何使用SQL2K8另一个数据库中定义的数据类型(表)?
-
03-10-2019 - |
题
我有一个数据库中定义的表类型。它用作存储过程中的表值参数。我想从另一个数据库调用此过程,为了传递参数,我需要引用此定义的类型。
但是当我这样做 DECLARE @table dbOtherDatabase.dbo.TypeName
,它告诉我 The type name 'dbOtherDatabase.dbo.TypeName' contains more than the maximum number of prefixes. The maximum is 1.
如何引用此表类型?
其他提示
您可以尝试使用sp_executesql:
DECLARE @mylist integer_list_tbltype,
@sql nvarchar(MAX)
SELECT @sql = N'SELECT p.ProductID, p.ProductName
FROM Northwind..Products p
WHERE p.ProductID IN (SELECT n FROM @prodids)'
INSERT @mylist VALUES(9),(12),(27),(37)
EXEC sp_executesql @sql, N'@prodids integer_list_tbltype READONLY', @mylist
如果那不起作用,您可能必须在远程数据库中创建包装程序,在该过程中,您可以在CSV字符串中传递,并且包装器过程将其拆分并创建表(现在使用本地表类型),然后传递到该表中实际过程。看 这个答案 有关如何拆分CVS字符串的说明。
在此线程之前,但是我试图做同样的事情,并对同样的限制感到烦恼。
不要声明 @表,而请使用可以从EXEC字符串调用数据库的#表,可以将数据库切换到具有表类型的#表。
例如
use dbA
create type ThisTableRecord as table (id int, value varchar(max))
go
create procedure ThisTableSave
@ThisTable ThisTableRecord readonly
AS
begin
select * from @thisTable
end
go
use dbB
go
create procedure ThatTableSave
as begin
create table #thatTable (id int, value varchar(max))
insert into #thatTable
values (1, 'killing')
, (2, 'joke')
, (3, 'the')
, (4, 'damned')
exec ('
use dbA
declare @thisTable thisTableRecord
insert into @thisTable select * from #thatTable
exec thisTableSave @thisTable
')
end
exec ThatTableSave
不隶属于 StackOverflow