Jednoduše
EXECUTE ('select id from [dbo].[CSVToTable] ('''example@sqldat.com+''')')
declare @listOfIDs varchar(1000);
Nebo, který je lepší způsob
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;
- Proč se mi zobrazuje tato chyba?
Protože opravdu předáváte příliš mnoho parametrů, více než je potřeba, abyste pochopili tento dotaz, spusťte tento dotaz a viděli, co skutečně předáváte své funkci
SELECT 'select id from [dbo].[CSVToTable] ('example@sqldat.com+')';
který se vrátí (a to se skutečně snažíte provést)
select id from [dbo].[CSVToTable] (5, 6, 7, 8, 9, 15, 28, 31, 49, 51, 59, 61)
místo (což je to, co potřebujete)
SELECT 'select id from [dbo].[CSVToTable] ('''example@sqldat.com+''')';
- Dobře, ale proč
sp_executesqlje lepší nežexec?
Jednoduše EXEC vás donutí zřetězit všechny vaše proměnné do jednoho jediného řetězce, to je na tom nejhorší a váš kód je plně otevřený vkládání SQL . Viz Bad Habits to Kick : Using EXEC() instead of sp_executesql
, to neznamená, že sp_executesql je 100% bezpečný, ale umožňuje příkazy parametrizovat zatímco EXEC() není, proto je bezpečnější než EXEC z hlediska SQL injection .
Konečně, protože označíte
sql-server
a neuvedete verzi, doporučuji použít SPLIT_STRING()
funkce (2016+) je spíše než ta vaše, a pokud nemáte verzi 2016+, vytvořte si vlastní bez použití WHILE smyčka pro získání lepšího výkonu, způsobí WHILE smyčka bude fungovat pomalu, proto byste se jí měli vyhnout.
Příklady: