繁体   English   中英

SQL Server中的动态查询

[英]Dynamic Query in SQL Server

我有一个表,其中有10列为col_1,col_2,.... col_10。 我想编写一条select语句,它将从这10个列之一中选择行之一的值。 我有一个变量,它将决定从哪一列中选择。 可以在从变量动态确定列名的地方编写这样的查询。

是的,使用CASE语句:

SELECT CASE @MyVariable
       WHEN 1 THEN [Col_1]
       WHEN 2 THEN [Col_2]
       ...
       WHEN 10 THEN [Col_10]
       END

这是否是一个好主意,完全是另一个问题。 您应该使用比Col_1,Col_2等更好的名称。

您也可以使用其他人建议的字符串替换方法。 但是,这是不得已的选择,因为它可以使您的代码容易受到sql注入攻击。

对我来说,这听起来像是一个糟糕的,标准化的设计。

我认为更好的方法是将该表作为父表,并在其中包含一个外键的行指向一个单独的子表,该子表包含十行,每行对应一个列。 当在父表中插入或更新行时,让父表根据该魔术值设置外键。

如果子表相当静态,这将起作用。

对于希望做动态sql的人们的好文章:

动态SQL的诅咒和祝福

由于我没有足够的详细信息,因此无法提供代码。 相反,我会解释。

声明一个字符串变量,类似于:

declare @sql varchar(5000)

将该变量设置为所需的完整SQL字符串(作为字符串,而不是实际查询...,因此您可以使用字符串连接嵌入要使用的行名)。

然后调用: exec(@sql)

可以了,好了。

我假设您纯粹在Transact-SQL中运行。 您需要做的是动态创建带有变量作为列名的SQL语句,并使用EXECUTE命令运行它。 例如:

EXECUTE('select ' + @myColumn + ' from MyTable')

您可以使用T-SQl CASE语句来做到这一点:

SELECT 'The result' =
   CASE 
     WHEN choice = 1 THEN col1
     WHEN choice = 2 THEN col2
     ...
   END
FROM sometable

恕我直言, 乔尔·科荷恩的案子声明可能是最好的主意

...但是如果您真的必须使用动态SQL,则可以使用sp_executeSQL()

我不知道您使用的平台是什么,但是您可以很容易地使用Dynamic LINQ来做到这一点。

var query = context.Table
                   .Where( t => t.Id == row_id )
                   .Select( "Col_" + column_id );

IEnumerator enumerator = query.GetEnumerator();
enumerator.MoveNext();
object columnValue = enumerator.Current;

大概,您将知道根据列将其强制转换为哪种实际类型。 这样做的好处是您可以免费获得参数化查询,从而保护您免受SQL注入攻击。

如果数据库的设计正确,那么您就不需要这样做。 我将重新考虑该架构元素的设计,以消除这样做的需要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM