Переменная как оператор mssql - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу использовать переменную в качестве оператора, подобного этому;

DECLARE @OP VARCHAR(3) = 'AND' -- THIS COULD BE 'AND','OR'
SELECT * FROM tblName WHERE Col1 = 1 @OP Col2 = 3

Очевидно, что я не могу использовать VARCHAR в качестве этого, единственное, о чем я могу думать, это SQL-инъекция, но мне было интересно, была либолее простое решение.

Пожалуйста, вы можете помочь.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Для завершения динамическое решение 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;
0 голосов
/ 21 ноября 2018

Вы можете попытаться выполнить динамический SQL, но есть способ, которым мы можем сделать это даже без динамического SQL:

SELECT *
FROM tblName
WHERE
    (@OP = 'AND' AND Col1 = 1 AND Col2 = 3) OR
    (@OP = 'OR' AND (Col1 = 1 OR Col2 = 3));
...