2016-01-28 3 views
1

Я написал эту процедуру и определила две строки в качестве параметров для него:Exec хранимая процедура с двумя параметрами строки

CREATE PROCEDURE [dbo].[spo_SelectTable1sDynamic] 
    @WhereCondition nvarchar(500), 
    @OrderByExpression nvarchar(250) = NULL 
AS 
    SET NOCOUNT ON 
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

    DECLARE @SQL nvarchar(3250) 

    SET @SQL = 'SELECT 
        [col1], [col2], [col3], [col4] 
       FROM 
        [dbo].[Table1] 
       WHERE 
       ' + @WhereCondition 

    IF @OrderByExpression IS NOT NULL AND LEN(@OrderByExpression) > 0 
    BEGIN 
     SET @SQL = @SQL + 'ORDER BY ' + @OrderByExpression 
    END 

    EXEC sp_executesql @SQL 

я должен пройти две строки для @whereconditio и @OrderByExpression параметров.

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

EXECUTE spo_SelectTable1sDynamic N'col1='book'' , N'col1 ' 
+2

** [Возможная инъекция SQL] (https://msdn.microsoft.com/en-us/libra ry/ms161953% 28v = sql.105% 29.aspx) ** Особенно '@ wherecondtition' передается целиком как строка – lad2025

+0

Как это решить? – programmer138200

+0

OK ................ – programmer138200

ответ

3

Прежде всего кода очень уязвимы для SQL Injection атаки.

Второй SELECT * FROM tbl WHERE @condition это проклятие:

If you are considering to write the procedure

CREATE PROCEDURE search_sp @condition varchar(8000) AS  
SELECT * FROM tbl WHERE @condition 

Just forget it. If you are doing this, you have not completed the transition to use stored procedure and you are still assembling your SQL code in the client.

Возможное решение заключается в использовании Динамические условия поиска и избежать динамического-SQL на все:

CREATE PROCEDURE [dbo].[spo_SelectTable1sDynamic] 
    @col1 NVARCHAR(1000), -- depending on business cases 
    @col2 INT ..., 
    @sortColumn SYSNAME 
AS 
BEGIN 
    SELECT .... 
    FROM table ... 
    WHERE (col1 = @col1 OR @col1 IS NULL) 
    AND (col2 = @col2 OR @col2 IS NULL) ... 
    ORDER BY 
    CASE @sortColumn 
      WHEN 'col1' THEN col1 
      WHEN 'col2' THEN col2 
      ... 
    END 
END 

Пользователь может назвать это как:

EXEC [dbo].[spo_SelectTable1sDynamic] @col1 = 'aaa' 
EXEC [dbo].[spo_SelectTable1sDynamic] @col2 = 10 
EXEC [dbo].[spo_SelectTable1sDynamic] @col1 = 'bbb', @col2 = 16 
-- or even 
EXEC [dbo].[spo_SelectTable1sDynamic 
-- to get all possible rows without any filter 
+0

Большое спасибо. Это хороший ответ – programmer138200

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