SQL变量作为Where子句中的列名

SyD*_*SyD 4 sql t-sql sql-server

我需要一些SQL逻辑方面的帮助,而且我已经工作(并且研究)了2天,但没有成功.

我的目标是尝试将ASP页面中的变量传递给存储过程,该过程将该变量用作where子句中列名的条件.

例如(我的查询的简化版本):

@strDept nvarchar(10), @strUser nvarchar(30)
-- The asp page will pass f18 to @strDept & Ted Lee to strUser
-- f18 is the column name in my database that I need in the where.

select x, y, z from table1 where @strDept in (@strUser)
-- and this is the select statement, notice the where clause.
Run Code Online (Sandbox Code Playgroud)

存储过程确实执行,但它不返回任何值,我知道它将@strDept视为文字nvarchar而不是列名.

所以我想我的问题是,如何让SQL Server 2005将@sqlDept变量视为列名?

pod*_*ska 7

你无法找到如何做到这一点的指导的原因是,这是一个非常糟糕的主意.

迟早,有人会传递一个"列名" 1 ;drop database badidea.这将是所有有关方面的祝福.

阅读SQL注入,重新考虑您的设计.


log*_*ist 5

如果这是一个内部公司应用程序,为什么每个人都重新迭代并击败SQL注入死...简单地使用动态SQL非常简单.如果您觉得这些只是内部用户使用它,那么它非常简单.这是概念.您基本上编写了一个SQL语句,该语句编写的字符串实际上是一个SQL语句,然后执行它.

CREATE Procedure myDynamicProcedure
@strDept nvarchar(10), 
@strUser nvarchar(30)

as 

BEGIN
Run Code Online (Sandbox Code Playgroud)

1.声明一个变量来存储SQL语句.

 DECLARE @SQL varchar(max)
Run Code Online (Sandbox Code Playgroud)

2.将您的@SQL变量设置为SELECT语句.基本上你正在构建它,所以它返回你想要写的东西.像这样:

   SET @SQL = 'select x, y, z from table1 where' + @strDept + 
 ' in ' + @strUser
Run Code Online (Sandbox Code Playgroud)

3.执行@SQL语句,它就像你运行的那样: 从table1中选择x,y,z,其中f18 ='Ted Lee'

EXEC (@SQL)
END
Run Code Online (Sandbox Code Playgroud)