[英]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的人们的好文章:
由于我没有足够的详细信息,因此无法提供代码。 相反,我会解释。
声明一个字符串变量,类似于:
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.