Внутри TSQL вы должны использовать sp_ExecuteSql
для выполнения любых необходимых вам динамических команд (например, для обеспечения гибкого поиска / сортировки).
Обратите внимание, что если вы не перепрыгнете через несколько обручей с сертификатами, вам все равно потребуется прямое SELECT
(и т. Д.) Разрешение на таблицу (в отличие от SPROC, который может предоставлять доступ неявно), но он должен быть безопасным для инъекций. Например:
DECLARE @command nvarchar(4000), @name varchar(50)
SELECT @command = 'SELECT * FROM [CUSTOMER] WHERE [Name] = @Name',
@name = 'Fred'
EXEC sp_ExecuteSql @command, N'@Name varchar(50)', @name
Очевидно, что в приведенном выше описании нет необходимости использовать динамический SQL - это только для иллюстрации! В основном это полезно, когда (внутри SPROC) у вас есть несколько необязательных условий поиска или гибкое предложение ORDER BY
.
В клиентах, отличных от TSQL, вы можете сделать то же самое с параметрами команды.
Также обратите внимание, что sp_ExecuteSql
также использует кэш процедур, поэтому может быть более эффективным, чем raw EXEC (@command)
.