2013-03-11 2 views
0

мне нужно написать MS SQL запрос для предварительного поиска, который основан на различных фильтрах , как название, описание, категория, автор, язык & ДатыMS SQL запрос для предварительного поиска

мне нужна этот запрос как хранимые но я не уверен, как я могу построить запрос, если CatID = 0, WriterID = 0 и т. д. Я могу построить этот запрос легко в C# (ASP.Net) с помощью IF Statement & пройти весь запрос, но я не уверен, как построить его как T-SQL или процедуры магазина

DECLARE @keyword nvarchar(300) 
DECLARE @CatID int 
DECLARE @WritterID int 
DECLARE @IssueID int 
DECLARE @sDate date 
DECLARE @eDate date 
DECLARE @LangID int 
    SET @keyword = 'xyz'; 
    SET @CatID = 1; 
    SET @WritterID = 1; 
    SET @IssueID = 1; 
    SET @sDate = '1/01/2012'; 
    SET @eDate = '1/01/2013'; 
    SET @LangID = 1 


SELECT ArticleID,ArticleTitle,ArticleCategoryID,ArticleAuthorID,IssueID,ArticlePublishDate FROM art_Articles 
    WHERE ArticleTitle LIKE '%'+ @keyword +'%' 
    OR ArticleDesc LIKE '%'+ @keyword +'%' 

пример кода в C#

strSql = "SELECT ArticleID, ArticleTitle, ArticleDesc, ArticlePublishDate FROM art_Articles WHERE "; 
    strSql += "((ArticleVisible = 1 AND ArticleActive =1 AND LanguageID =" + LangID + "))"; 
     if (CatID > 0) 
     { strSql += " AND ArticleCategoryID ="+ CatID; } 
     if (WriterID > 0) 
     { strSql += " AND ArticleAuthorID ="+ WriterID; } 
+1

Я думаю, вы могли бы это прочитать: [Динамические условия поиска в T-SQL] (http://www.sommarskog.se/dyn-search-2008.html) –

+0

Проверьте это: http: // stackoverflow. com/questions/263801/sql-server-dynamic-queries –

+1

Невозможно подчеркнуть важность чтения статьи, связанной с @MikaelEriksson –

ответ

2

Вы можете создать свой SQL в SqlServer так же, как в коде C#.

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

Это называется динамический SQL.

Вы можете выполнить этот код с помощью «EXEC» команда

Пример:


DECLARE @SQL VARCHAR(100) 
DECLARE @LangID VARCHAR(20) 
DECLARE @CatID VARCHAR(20) 
DECLARE @WriterID VARCHAR(20) 

SET @SQL = 'SELECT ArticleID, ArticleTitle, ArticleDesc, ArticlePublishDate FROM art_Articles WHERE ' 

SET @SQL = @SQL + '((ArticleVisible = 1 AND ArticleActive =1 AND LanguageID =' + @LangID 

IF (@CatID > 0) 
    SET @SQL = @SQL + ' AND ArticleCategoryID =' + @CatID 

IF (@WriterID > 0) 
    SET @SQL = @SQL + ' AND ArticleAuthorID ='+ @WriterID 

EXEC (@SQL) 

Однако то, что вы действительно должны обратить внимание при использовании этого метода является проблема безопасности под названием «SQL Injection ».

Вы можете прочитать об этом здесь: http://msdn.microsoft.com/en-gb/library/ms161953(v=sql.105).aspx

Один из способов для защиты от инъекции SQL, чтобы проверить против него в коде C#, прежде чем передать переменные в SQL-Server.

Альтернативный способ (или, вероятно, лучше всего используется в гипотезе) вместо использования команды «EXEC», использует встроенную хранимую процедуру, называемую «sp_executesql».

Детали, которые можно найти здесь: http://msdn.microsoft.com/en-gb/library/ms188001.aspx Как он используется подробно здесь: http://msdn.microsoft.com/en-gb/library/ms175170(v=sql.105).aspx

Вы должны создать свой SQL немного по-другому и передать ваши параметры хранимой процедуры, а также @ SQL.

+0

У меня есть аналогичный подход для решения этой проблемы, и я знаю об уязвимостях sql-инъекций в этом подходе , Я использовал тот же подход, который я опубликовал в качестве ответа. Я согласен с вами в отношении уязвимостей, которые необходимо позаботиться о сильной проверке. Я был бы признателен, если бы вы предложили любой другой подход, который намного безопаснее. – Learning

+0

Я также заметил, что в вашем подходе вы использовали '' Varchar() 'тип данных для каждой переменной, которая может затруднить проверку внутри T-SQL и если вы определяете переменные Integer как' INT', тогда вы получаете ошибку преобразования 'Conversion failed при преобразовании varchar value'. Я не могу найти причину этого, но проверка может выполняться с помощью кода, чтобы получить чистый запрос sql. Будет сложно обрабатывать SQL-инъекцию специально, если sql-инъекция имеет HEX-код, это то, что они называют SQL Query with HEX ... Я не уверен, как фильтровать, если они вставляют HEX-код. Любое это другое Q? – Learning

+0

Я обновил свой ответ с более подробной информацией о том, как защититься от SQL Injection. Это в основном использование «sp_executesql» вместо «EXEC». –

Смежные вопросы