2012-03-05 74 views
0

我有一个表有一个名为category的列。列类别的值为“6,7,9,22,44”。我想知道这种方法是否是SQL Server 2005或2008的高效方法。我基本上将“6,7,9,22,44”值传递给存储过程。我是一个更好的方法的开放链接/建议。动态sql - 这是一个好方法吗?

~~~~~~~~~~~~~~~~~~~~~ ~~~~~~ 注意:我应该澄清,我正在维护一个由其他人编写的应用程序,并且类别列已经有逗号分隔值。我会将数据放在一个单独的表格中,但短期内我无法做到这一点。关于SQL注入 - 该列由从复选框列表中检查的值填充。用户不能输入或输入任何会影响特定存储过程的数据。在这种情况下SQL注入仍然可能吗?请解释如何。谢谢。 35~~~

CREATE PROCEDURE [dbo].[GetCategories] 
    -- Add the parameter that contain the string that is passed in 
    @catstring varchar(300) 
AS 
DECLARE @SQLQuery nvarchar(500); 
BEGIN 

    /* Build Transact-SQL String with parameter value */ 
    SET @SQLQuery = 'select id,category from categoryTable where id in ('+ @catstring +')' 
    /* Execute Transact-SQL String */ 
    EXECUTE(@SQLQuery) 
END 
GO 
+3

不可以。您的代码容易受到[SQL注入](http://bobby-tables.com/)的影响。 – 2012-03-05 20:50:33

+0

将逗号分隔的值存储在列中并不好。 – 2012-03-05 20:53:11

+0

您是否使用C#或其他服务器端编程语言? – Meryovi 2012-03-05 20:58:49

回答

2

这是一个非常糟糕的主意,因为这会使你的系统开放的SQL注入。恶意用户可能能够传递字符串,例如“'DROP TABLE categoryTable - ”(注意字符串开头的单引号),或者更糟的事情。

有很多方法可以保护您免受SQL注入攻击,并且有大量资源。我建议你自己研究一下,因为它在单个问题中覆盖范围太大。

要不是你的具体问题,我建议这个网站,以了解如何创建一个表值参数的整数ID的列表来传递:http://www.sommarskog.se/arrays-in-sql-2008.html

这仅适用于SQL Server 2008,您应遵循如果需要的话,可以在那篇文章中找到SQL Server 2005解决方案的链接。

相关问题