T-SQL создает динамический оператор where? - PullRequest
3 голосов
/ 06 августа 2010

Я знаю, что это невозможно, но есть ли что-то, что будет работать?По сути, я хочу, чтобы оператор where был динамическим, позволяя мне передавать ему любую строку, по которой он сможет искать.

Declare @search varchar(80)
set @search = 'RegionID'

Select * from TBL_TripDetails
Where @search = '1'

Спасибо за ваши ответы.Прочитав несколько документов, я решил использовать несколько операторов выбора вместо использования динамического SQL.спасибо!

Ответы [ 5 ]

5 голосов
/ 06 августа 2010
declare @sql nvarchar(max);
set @sql = N'select * from table where ' + quotename(@search) + N'=''1''';
exec sp_executesql @sql;

См. Проклятие и благословения динамического SQL

2 голосов
/ 06 августа 2010

Это действительно возможно, хотя часто осуждают.Посмотрите на sp_executesql

1 голос
/ 06 августа 2010

Я немного запутался с вашим вопросом "передайте ему любую строку, по которой он сможет искать".В вашем примере передача в поле, которое сравнивается с жестко закодированным значением 1, на самом деле не соответствует вашему описанию.

Если это действительно то, что вы хотели, тогда вам нужно будет использоватьДинамический SQL.Если вы просто хотите иметь возможность поддерживать необязательные критерии / параметры поиска (например, если для RegionID установлено значение, тогда примените критерии, иначе игнорируйте критерии), используйте приведенный ниже пример.

DECLARE @RegionID AS VARCHAR(1);

SELECT * 
FROM TABLE
WHERE (@RegionID Is Null OR @RegionID = '' OR RegionID = @RegionID);

Теперь, если @RegionID пустое или NULL, оно не будет использоваться в критериях.

1 голос
/ 06 августа 2010
DECLARE @search VARCHAR(80)
DECLARE @SQL VARCHAR(8000)

SET @search = 'RegionID'

SET @SQL = 'SELECT * FROM TBL_TripDetails WHERE ' + @search + ' = 1'
EXEC @SQL

Будьте осторожны, хотя. Объединение SQL может разрешить атаки с использованием SQL-инъекций.

1 голос
/ 06 августа 2010
Declare @search varchar(80)
set @search = 'RegionID'

declare @query varchar(max)
set @query = "Select * from TBL_TripDetails Where " + @search + " = '1'"
exec @query
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...