Динамические условия в предложении WHERE

У меня есть хранимая процедура, и я хотел бы знать, возможно ли создать динамическое условие where на основе параметра.

Допустим, у меня есть этот запрос:

SELECT *
FROM tbl_Users

Теперь у меня есть параметр с именем @username, который я хотел бы использовать для создания динамического условия where (которое в моей программе может быть одним или несколькими условиями). Чтобы добиться чего-то подобного, я использую следующее утверждение:

SELECT *
FROM tbl_Users
@username -- where this parameter might hold a condition string such as "Where usr_Username = 5 and usr_first_name like '%Frank%' etc

Можно ли сделать что-то подобное?


person Kelish    schedule 04.08.2011    source источник
comment
Не в самом T-SQL; вы можете создать этот оператор SELECT на своем интерфейсном языке (C#, VB.NET или любом другом) и отправить его на SQL Server после его завершения, или вы можете использовать динамический SQL внутри оператора T-SQL для создания вашего запроса как строку, а затем выполнить эту строку, но вы не можете просто параметризовать часть своего запроса T-SQL, как это....   -  person marc_s    schedule 04.08.2011
comment
Вы можете сделать это с помощью построения строк (как продемонстрировали несколько человек ниже), но просто предостережение - избегайте динамического sql, если у вас есть какой-либо выбор в этом вопросе - очень сложно писать, поддерживать, обновлять, устранять неполадки и т. д.   -  person Chains    schedule 04.08.2011


Ответы (4)


Для этого вам придется взломать динамический sql.

это будет работать примерно так:

declare @sql varchar(max)

set @sql = '
    SELECT *
    FROM tbl_Users
    WHERE ' + @username

exec (@sql)
person Jon Egerton    schedule 04.08.2011

Я не уверен, что понимаю вас, но если я правильно понимаю, вы можете сделать следующее (ВНИМАНИЕ: инъекция уязвима)

DECLARE @SQL varchar(500) = 'SELECT * FROM tbl_users ' + @username

EXEC @SQL
person Sam DeHaan    schedule 04.08.2011

Насколько я знаю, это не сработает. Вам нужно будет сгенерировать сценарий, который вы хотите выполнить, и использовать команду exec.

person ek_ny    schedule 04.08.2011

Вы действительно не должны объединять ключевые слова и параметры SQL в одну строку, как показано в некоторых ответах выше, по причинам, открывающим двери для внедрения SQL (одна из участники действительно назвали это. Это мудрое предупреждение!).

Вместо этого вы должны параметризировать свой SQL и выполнить системный SP sp_executesql.

Очень хороший пример кода показан в этой публикации StackOverflow.

person Wolfgang    schedule 27.08.2014