Semplicemente
EXECUTE ('select id from [dbo].[CSVToTable] ('''example@sqldat.com+''')')
declare @listOfIDs varchar(1000);
Oppure, qual è il modo migliore
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;
- Perché ricevo questo errore?
Poiché passi davvero troppi parametri, più del necessario, per capirlo esegui questa query e vedi cosa sei veramente passa alla tua funzione
SELECT 'select id from [dbo].[CSVToTable] ('example@sqldat.com+')';
che tornerà (e questo è ciò che stai veramente cercando di eseguire)
select id from [dbo].[CSVToTable] (5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61)
invece di (che è quello che ti serve)
SELECT 'select id from [dbo].[CSVToTable] ('''example@sqldat.com+''')';
- Ok, ma perché
sp_executesqlè meglio diexec?
Semplicemente, EXEC ti costringerà a concatenare tutte le tue variabili in un'unica stringa, questa è la cosa peggiore, e questo rende il tuo codice completamente aperto a SQL injection . Vedi Bad Habits to Kick : Using EXEC() instead of sp_executesql
, questo non significa che sp_executesql è sicuro al 100%, ma consente di parametrizzare le istruzioni mentre EXEC() no, quindi è più sicuro di EXEC in termini di SQL injection .
Infine, poiché tagghi
sql-server
e non specifichi la versione, ti suggerisco di utilizzare SPLIT_STRING()
funzione (2016+) piuttosto che la tua, e se non hai la versione 2016+, creane una tua senza usare WHILE loop per ottenere prestazioni migliori, causa WHILE loop funzionerà lentamente, quindi dovresti evitarlo.
Esempi: