Simplesmente
EXECUTE ('select id from [dbo].[CSVToTable] ('''example@sqldat.com+''')')
declare @listOfIDs varchar(1000);
Ou, qual é a melhor maneira
SET @listOfIDs = '5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61';
EXECUTE sp_executesql N'select id from [dbo].[CSVToTable] (@listOfIDs)',
N'@listOfIDs VARCHAR(1000)',
@listOfIDs;
- Por que recebo este erro?
Porque você realmente passa parâmetros demais, mais do que o necessário, para entender isso execute essa consulta e veja o que você realmente está passando para sua função
SELECT 'select id from [dbo].[CSVToTable] ('example@sqldat.com+')';
que retornará (e é isso que você realmente está tentando executar)
select id from [dbo].[CSVToTable] (5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61)
em vez de (que é o que você precisa)
SELECT 'select id from [dbo].[CSVToTable] ('''example@sqldat.com+''')';
- Ok, mas por que
sp_executesqlé melhor queexec?
Simplesmente,
EXEC vai forçar você a concatenar todas as suas variáveis em uma única string, essa é a pior coisa, e isso torna seu código totalmente aberto para injeção de SQL . Veja Bad Habits to Kick : Using EXEC() instead of sp_executesql
, isso não significa que sp_executesql é 100% seguro, mas permite que as declarações sejam parametrizadas enquanto EXEC() não, portanto, é mais seguro que EXEC em termos de injeção de SQL . Por fim, como você marca
sql-server
e você não especificar a versão, sugiro que você use SPLIT_STRING()
função (2016+) em vez da sua, e se você não tiver a versão 2016+, crie a sua própria sem usar WHILE loop para obter um melhor desempenho, porque WHILE loop será lento, portanto, você deve evitá-lo. Exemplos:
-
How to split a comma-separated value to columns
-
Tally OH! An Improved SQL 8K “CSV Splitter” Function
-
Reaping the benefits of the Window functions in T-SQL