返回SQL Server 2008中的可变列数

时间:2011-11-14 09:01:52

标签: sql-server-2008 stored-procedures

我的表格包含以下字段Name,Age,Salary,Phone,DOB。根据设置表,我只需要选择一些字段。例如,我在设置中说,只需要NamePhone。我怎么能用存储过程来做呢?

编辑:

哪一个好。

  1. 从表格中选择所需字段。
  2. 选择所有列,在ASP.NET页面中,使用.Visibility属性隐藏或显示列

4 个答案:

答案 0 :(得分:2)

SQL是一种固定的列语言:无法“动态”添加或删除列

您需要使用动态SQL来构建SELECT语句,或使用IF语句来执行不同的语句。但是,您会打开缓存,安全性和注入问题。

就个人而言,我会忽略客户端代码中的列,并且具有简单,单一的高效SQL查询。 SQL Server和客户端之间的契约或API应该是静态的和可预测的。如果在SQL Server中应用了设置表,则客户端不知道要使用哪些列。如果您的客户确实知道,那么它可以忽略它们。

编辑后,选项2,种类。

但是在在页面中呈现之前,应该删除中的数据。

保持简单:不要尝试优化任何尚未

答案 1 :(得分:2)

您需要在存储过程中根据设置表选择多个不同的选项,以返回不同的数据集。

 CREATE PROCEDURE dbo.YourProcedure(...)
 AS BEGIN
   DECLARE @Setting INT  -- ?? whatever it is 

   SELECT @Setting = Choice FROM dbo.YourSettingsTable WHERE ....... ???

   IF @Setting = 1
      SELECT Name, Phone
      FROM dbo.YourDataTable

   ELSE
      SELECT Name, Age, DOB, Phone, Salary  
      FROM dbo.YourDataTable

 END

然而,使用这种方法有危险 - 因为存储过程可能会返回一组数据或另一组数据,您的SQL Server查询优化器可能会对如何访问一个设置的数据作出非常好的决定 - 但是你的设置发生变化,执行计划将完全过时,从而可能导致可怕的表现......

另一方面 - 可能更容易确定在调用存储过程之前设置 - 然后将该设置作为存储过程参数传递。

甚至更好:为每个“场景”分别存储过程 - 然后从调用者那里调用适当的存储过程,具体取决于你的设置值....

答案 2 :(得分:1)

动态创建你想要的sql然后用exec执行它。

    declare @sql varchar(500)
    set @sql = 'select 123'
    exec (@sql)

上述代码可以帮助您了解您需要了解的内容。

答案 3 :(得分:0)

  1. 为要选择的每组字段设置存储过程
  2. 允许将字段名称列表作为参数传递