Simplemente
EXECUTE ('select id from [dbo].[CSVToTable] ('''example@sqldat.com+''')')
declare @listOfIDs varchar(1000);
O, cuál es la mejor manera
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 qué aparece este error?
Debido a que realmente pasa demasiados parámetros, más de los necesarios, para comprender esto, ejecute esta consulta y vea lo que realmente está pasando a su función
SELECT 'select id from [dbo].[CSVToTable] ('example@sqldat.com+')';
que regresará (y esto es lo que realmente intentas ejecutar)
select id from [dbo].[CSVToTable] (5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61)
en lugar de (que es lo que necesitas)
SELECT 'select id from [dbo].[CSVToTable] ('''example@sqldat.com+''')';
- Vale, pero ¿por qué
sp_executesql? es mejor queexec?
Simplemente, EXEC lo obligará a concatenar todas sus variables en una sola cadena, eso es lo peor de todo, y eso hace que su código esté completamente abierto a inyección SQL . Consulte Bad Habits to Kick : Using EXEC() instead of sp_executesql
, esto no significa que sp_executesql es 100% seguro, pero permite parametrizar las sentencias mientras EXEC() no, por lo tanto, es más seguro que EXEC en términos de inyección SQL .
Finalmente, dado que etiqueta
servidor-sql
y no especifica la versión, le sugiero que use SPLIT_STRING()
función (2016+) más que la suya, y si no tiene la versión 2016+, cree la suya propia sin usar WHILE bucle para obtener un mejor rendimiento, causa WHILE el bucle funcionará lento, por lo que debe evitarlo.
Ejemplos: