Apenas uma pergunta rápida. Eu tenho um procedimento armazenado que usa dois parâmetros, um varchar (nome da tabela) e um tipo de tabela (intervalo de valores de ID de chave primária) e os usa para retornar todas as conexões FK de e para a tabela para os IDs fornecidos.
O uso é complicado, já que você realmente precisa declarar o tipo de tabela, selecionar os IDs nele e executar o procedimento da seguinte forma:
DECLARE @IDVALS SearchObjRef_Type
INSERT INTO @IDVALS
SELECT TOP 10 RAND_ID FROM RANDTABLE
EXEC usp_SearchObjRef @TABLENAME = 'RANDTABLE', @IDRANGE = @IDVALS
Isso funciona muito bem, mas eu gostaria de encontrar uma maneira mais confortável, rápida e fácil de usar o procedimento em seleções padrão. Qual seria a melhor maneira, supondo que seja possível, fazer tudo isso em um comando?
Para um exemplo lógico que obviamente não funciona, o que eu gostaria de fazer é uma forma do seguinte:
EXEC usp_SearchObjRef @TABLENAME = 'RANDTABLE',
@IDRANGE = (SELECT TOP 10 RAND_ID FROM RANDTABLE)
A maneira como você está fazendo isso é a maneira mais rápida, fácil e confortável que você encontrará para passar um TVP para um procedimento armazenado, desculpe. Você não pode passar expressões para parâmetros de procedimentos armazenados, mesmo coisas simples como:
Falha com:
Para usar uma expressão, ela precisa ser:
Se a saída for um único conjunto de resultados que sempre tenha as mesmas colunas (por exemplo
TableName, RowCount
), você pode escrever uma função CLR com valor de tabela e usar a string de consulta como parâmetro. Não há uma maneira realmente limpa de fazer isso em T-SQL simples.