Como recuperar o valor de um tipo de tabela definido pelo usuário (UDTT)
-
26-09-2020 - |
Pergunta
Meta:
Quero alcançar e exibir o valor de @data dentro de [wwtest].
Problema:
O UDTT é do banco de dados [test] e recebo uma mensagem de erro:
O nome do tipo 'test.dbo.tvf_id' contém mais do que o número máximo de prefixos.O máximo é 1.
Não sei como recuperar os dados do banco de dados [test] em uma consulta atualmente no banco de dados [wwtest]?
create table datatable (id int,
name varchar(100),
email varchar(10),
phone varchar(10),
cellphone varchar(10),
none varchar(10)
);
insert into datatable values
(1, 'productname', 'A', 'A', 'A', 'A'),
(2, 'cost', '20', 'A', 'A', 'A'),
(3, 'active', 'Y', 'A', 'A', 'A');
insert into datatable values
(4, 'productname', 'A', 'A', 'A', 'A'),
(5, 'cost', '20', 'A', 'A', 'A'),
(6, 'active', 'Y', 'A', 'A', 'A');
insert into datatable values
(7, 'productname', 'A', 'A', 'A', 'A'),
(8, 'cost', '20', 'A', 'A', 'A'),
(9, 'active', 'Y', 'A', 'A', 'A');
CREATE TYPE [tvf_id] AS TABLE
(
[id] [int] NULL
,[OrdCol] [INT] NOT NULL
)
GO
DECLARE @data tvf_id INSERT INTO @data([id],[OrdCol])
VALUES (8,1), (2,2), (4,3), (1,4), (3,5);
Solução
Você precisa criar o tipo dentro do banco de dados onde irá declará-lo - os tipos de dados não podem ser alcançados através de bancos de dados ou servidores.Isso não é diferente de criar uma variável local usando um tipo de alias - ela deve existir no contexto do banco de dados atual (ou seu código deve ser executado no contexto do banco de dados onde o tipo existe, por exemplo
EXEC dbname.sys.sp_executesql N'DECLARE @t dbo.type;
INSERT @t(cols) SELECT whatever...;
-- do other stuff but it has to be in this dynamic SQL block';