É possível que o parâmetro Table-Valued seja usado como parâmetro de saída para o procedimento armazenado?
Aqui está, o que eu quero fazer no código
/*First I create MY type */
CREATE TYPE typ_test AS TABLE
(
id int not null
,name varchar(50) not null
,value varchar(50) not null
PRIMARY KEY (id)
)
GO
--Now I want to create stored procedu whic is going to send output type I created,
--But it looks like it is inpossible, at least in SQL2008
create PROCEDURE [dbo].sp_test
@od datetime
,@do datetime
,@poruka varchar(Max) output
,@iznos money output
,@racun_stavke dbo.typ_test READONLY --Can I Change READONLY with OUTPUT ?
AS
BEGIN
SET NOCOUNT ON;
/*FILL MY OUTPUT PARAMS AS I LIKE */
end
Não, infelizmente os parâmetros de valor da tabela são somente leitura e somente entrada. Esse tópico em geral é muito bem abordado em Como Compartilhar Dados entre Stored Procedures , que apresenta todas as alternativas. Minha recomendação seria usar uma
#temp
mesa.Este é um post mais antigo, mas estava perto do topo quando eu estava procurando por "Parâmetro com valor de tabela como parâmetro de saída para procedimento armazenado". Embora seja do meu entendimento que você não pode passar um parâmetro com valor de tabela como um parâmetro de saída, imagino que o objetivo seja usar esse parâmetro de saída com valor de tabela como um parâmetro de entrada com valor de tabela em outro procedimento. Vou mostrar um exemplo de como eu fiz isso funcionar.
Primeiro, crie alguns dados para trabalhar:
Em seguida, crie um procedimento armazenado para capturar alguns dos dados. Normalmente, isso seria onde você está tentando criar um parâmetro de saída com valor de tabela.
Além disso, você desejará criar um tipo de dados (tipo de tabela) em que os dados do primeiro procedimento armazenado possam ser passados como parâmetro de entrada para o próximo procedimento armazenado.
Em seguida, crie o segundo procedimento armazenado que aceitará o parâmetro com valor de tabela.
Concedido, este não é um verdadeiro parâmetro de saída com valor de tabela, mas provavelmente produzirá resultados semelhantes ao que você estaria procurando. Declare seu parâmetro com valor de tabela, preencha-o com dados executando o procedimento armazenado nele e use-o como variável de entrada para o próximo procedimento.
além da resposta bem colocada por remus, incluindo o link que ele forneceu
Como compartilhar dados entre procedimentos armazenados
há situações em que você obtém as seguintes mensagens de erro ao salvar os resultados de um procedimento armazenado em uma tabela:
Uma instrução INSERT EXEC não pode ser aninhada.
A transação atual não pode ser confirmada e não suporta operações que gravam no arquivo de log. Reverter a transação
e quando isso acontece em meus próprios procedimentos armazenados que desenvolvo para meu próprio uso
por exemplo, uma ferramenta para me informar de
login
todos os grupos do AD aos quais pertence e todas as suas permissões em todos os bancos de dados em um servidorEu crio uma tabela temporária fora do procedimento e passo o nome dela como parâmetro
e dentro do procedimento, após todos os cálculos, quando estou retornando os dados finais (abaixo um exemplo) verifico se estamos saindo para uma tabela ou apenas voltando para a tela e crio o script dinamicamente.
Depois disso você tem as informações que você precisa na tela, ou se você passou uma tabela temporária como parâmetro, ela terá os dados agora.
esta é uma solução que encontrei, mas só a uso para meus próprios trabalhos,
DBA
caso contrário, isso será considerado de alto risco para Sql Injection .Uma tabela pode ser convertida em JSON (SQL Server 2016 ou posterior) e passada como um parâmetro nvarchar:
[{"valor":"abc","ordinal":1},{"valor":"def","ordinal":2}]
Em seguida, para convertê-lo novamente em uma tabela, especifique os nomes das colunas como chaves JSON: