SQL Server中的动态查询

时间:2009-02-09 15:24:17

标签: sql sql-server sql-server-2005

我有一个包含10列的表格col_1,col_2,.... col_10。我想写一个select语句,它将选择一行的值和这10列中的一列。我有一个变量,将决定从哪个列中进行选择。可以在从变量动态决定列名的位置写入此类查询。

9 个答案:

答案 0 :(得分:11)

是的,使用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注入攻击。

答案 1 :(得分:3)

听起来像是一个糟糕的,非规范化的设计。

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

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

答案 2 :(得分:3)

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

The Curse and Blessings of Dynamic SQL

答案 3 :(得分:2)

由于我没有足够的细节,我无法提供代码。相反,我会解释。

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

declare @sql varchar(5000)

将该变量设置为您想要的已完成的SQL字符串(作为字符串,而不是实际查询...所以您使用字符串连接嵌入了您想要的行名称。)

然后致电:exec(@sql)

全部设定。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

您可以使用T-SQl CASE语句执行此操作:

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

答案 6 :(得分:0)

恕我直言,Joel Coehoorn's case statement可能是最好的主意

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

来完成

答案 7 :(得分:0)

我不知道您使用的是什么平台,但您可以非常轻松地使用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注入攻击。

答案 8 :(得分:0)

如果数据库设计正确,这不是您应该做的事情。我将重新审视模式中该元素的设计,以消除执行此操作的需要。