Я хочу использовать переменную в качестве такого оператора;
DECLARE @OP VARCHAR(3) = 'AND' -- THIS COULD BE 'AND','OR'
SELECT * FROM tblName WHERE Col1 = 1 @OP Col2 = 3
Очевидно, я не могу использовать VARCHAR в качестве этого, единственное, что я могу придумать, это SQL-инъекция, но мне было интересно, есть ли более простое решение.
Пожалуйста, не могли бы вы помочь?





Вы можете попробовать выполнить динамический SQL, но есть способ сделать это даже без динамического SQL:
SELECT *
FROM tblName
WHERE
(@OP = 'AND' AND Col1 = 1 AND Col2 = 3) OR
(@OP = 'OR' AND (Col1 = 1 OR Col2 = 3));
Я думаю, что это на правильном пути, кроме того, что mssql огромен, и может создать некоторые действия для использования этого метода, есть ли способ просто объявить переменную как оператор, например; ОБЪЯВИТЬ @OP OPERATOR = И
@Kiel Нет, нет. Вам нужно будет выполнить динамическую строку SQL, если у вас действительно есть это требование.
Что ж, это то, что есть, спасибо за вашу помощь, я постараюсь вставить это в свой код. Очень признателен..
Если вам нужно делать это часто, я рекомендую использовать динамический SQL-маршрут. Мне нужно было только экономно использовать его в SQL Server, иначе я бы также включил это в свой ответ.
Думаю, я смогу его использовать, просто нужно какое-то время смотреть на свой код LOL.
Для завершения динамическое решение SQL будет выглядеть следующим образом:
DECLARE @Op nvarchar(3) = N'AND';
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT * FROM TblName WHERE Col1 = 1 ' + CASE WHEN @OP IN (N'AND',N'OR') THEN @OP END + N' Col2 = 3;';
EXEC sp_executesql @SQL;
CASE нужен, чтобы избежать инъекции, поскольку значение @Op должно быть либо AND, либо OR (иначе значение @SQL приведет к NULL, и ничего не будет запущено).
Если вам нужно параметризовать значения Col1 и Col2, то это будет:
DECLARE @OP nvarchar(3) = N'AND';
DECLARE @SQL nvarchar(MAX);
DECLARE @col1 int = 1, @col2 int =3;
SET @SQL = N'SELECT * FROM TblName WHERE Col1 = @dCol1 ' + CASE WHEN @OP IN (N'AND',N'OR') THEN @OP END + N' Col2 = @dCol2;';
EXEC sp_executesql @SQL,N'@dCol1 int, @dCol2 int', @dCol1 = @Col1, @dCol2 = @Col2;
Это тоже работает, я использую без SQL-инъекции, но оба ответа, похоже, работают. Спасибо..
Вы имеете в виду, что убрали выражение @Kiel из CASE? Если так, то, хотя это nvarchar(3), лично я бы все равно оставил его там для «безопасности».
Для этого вам понадобится
Dynamic SQL.