T-SQL: динамический запрос по выбранному столбцу в ASP.NET GridView - PullRequest
2 голосов
/ 14 ноября 2011

Я пытаюсь изменить хранимую процедуру, используемую на странице ASP.NET.

По умолчанию хранимая процедура возвращает все данные, которые могут быть чрезмерными для сотрудников на предприятии.

Я хочу добавить пункт раскрывающегося меню для имени столбца и текстовое поле для значения, чтобы наши сотрудники могли искать данные для своих конкретных элементов.

Я хотел бы добавить возможность передачи имени столбца и значения столбца для поиска, аналогично следующему:

DECLARE @colName nVarChar(50), @colValue nVarChar(50)
SET @colName='EmployeeID'
SET @colValue='007135'
SELECT  Column1, Column2, Column3, Column4, Column5, Column6, Column7
FROM    viewNum1
WHERE   ((@colName IS NULL) OR (@colValue IS NULL) OR ('['+@colName+']'=@colValue))

Если все значения переданы (@colValue и @colName), возвращаются все записи; однако, если я попытаюсь указать, что @colName = EmployeeID и @colValue = '007135' (значение, которое существует в базе данных), никакие записи не возвращаются.

Следующая проблема заключается в том, что я запускаю старую базу данных SQL Server 2000, которая не позволяет хранимой процедуре обращаться к именам столбцов таблицы, и весь метод выглядит склонным к SQL-инъекции.

Наконец, я не вижу, как привязать к этому свой элемент управления GridView, и у меня все еще есть возможность отображать все записи.

Как мне написать такую ​​хранимую процедуру фильтрации?

Ответы [ 2 ]

3 голосов
/ 14 ноября 2011

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

DECLARE @colName nVarChar(50) = NULL;
DECLARE @colValue nVarChar(50) = NULL;

DECLARE @sql = 'SELECT Column1,Column2,Column3,Column4,Column5,Column6,Column7 FROM viewNum1 WHERE 1=1 ';

if ISNULL(@colName,'')<>'' AND ISNULL(@colValue,'')<>''
    SET @sql = @sql + ' AND ' + @colName + '=''' + @colValue + '''';


exec(@sql);

Я бы порекомендовал вам вместо этого создать прок с обнуляемыми параметрами для каждого столбца, поскольку это безопаснее:

CREATE PROCEDURE dbo.ProcName
    @Column1 as nvarchar(50) = NULL,
    @Column[n] as [dbtype] = NULL
AS
BEGIN

SELECT Column1, Column[n]...
FROM viewNum1
WHERE
((@Column1 IS NULL) OR (Column1 = @Column1))
AND ((@Column[n] IS NULL) OR (Column[n] = @Column[n]))...

END

GO
1 голос
/ 14 ноября 2011

Вам нужно будет сгенерировать всю строку SQL (динамический sql), если вы передадите имя столбца в качестве параметра.

И затем вы используете exec(SQL_STATEMENT) для выполнения оператора sql. Кстати, я не рекомендую делать это. Вот пример на dbforums: http://www.dbforums.com/microsoft-sql-server/969925-passing-table-column-name-parameter-stored-procedure.html

Также в вашем коде эта часть не имеет особого смысла @colValue IS NULL. Если я правильно читаю, вы указываете, имеет ли значение значение NULL и никогда не было.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...