«Простой» ответ: не объединение необработанных строковых значений в динамическом выражении и параметризация вашего кода. Это бит догадок, однако гораздо безопаснее, чем дыра в SQL-инъекции, которая у вас есть прямо сейчас:
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT @ExistingIDs = ' + QUOTENAME(@TSectionName) + NCHAR(13) + NCHAR(10)+
N'FROM ##tempPivot' + NCHAR(13) + NCHAR(10) +
N'WHERE EmployeeID = @TUserID;';
PRINT @SQL;
EXEC sp_executesql @SQL,
N'@TUserID int, @ExistingIds int OUTPUT', --guessed datatypes and that @ExistingIds is an OUTPUT
@TUserID = @TUserID,
@ExistingIds = ExistingIds OUTPUT;
Примечание: тот факт, что ваша переменная называется @ExistingIDs
, подразумевает , что вы хотите сохранить несколько значений в этой переменной. @ExistingIDs
является скалярным значением, оно будет содержать только скалярное (одиночное) значение. Если запрос выше возвращает несколько строк, будет возвращено только значение из последней строки. Например:
DECLARE @i int;
SELECT @i = I
FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9))V(I)
ORDER BY I;
SELECT @i;
Обратите внимание, что @i
имеет значение 9
, а не '1,2,3,...,9'
.