Sql server 2008 返回SQL Server 2008中的可变列数

Sql server 2008 返回SQL Server 2008中的可变列数,sql-server-2008,stored-procedures,Sql Server 2008,Stored Procedures,我的表格包含以下字段,姓名、年龄、工资、电话、出生日期。根据设置表,我只能选择一些字段。例如,我说在设置中,只需要Name和Phone。我如何使用存储过程来实现它 编辑: 哪一个好 从表中选择所需字段 选择所有列,然后在ASP.NET页面中,使用.Visibility属性隐藏或显示列 为要选择的每一组字段设置一个存储过程 允许将字段名列表作为参数传入 SQL是一种固定列语言:不能“动态”添加或删除列 您需要使用动态SQL来构建SELECT语句,或者使用IF语句来执行不同的语句。但是,这会带来缓存

我的表格包含以下字段,
姓名、年龄、工资、电话、出生日期
。根据设置表,我只能选择一些字段。例如,我说在设置中,只需要
Name
Phone
。我如何使用存储过程来实现它

编辑:

哪一个好

  • 从表中选择所需字段
  • 选择所有列,然后在ASP.NET页面中,使用
    .Visibility
    属性隐藏或显示列
  • 为要选择的每一组字段设置一个存储过程
  • 允许将字段名列表作为参数传入

  • SQL是一种固定列语言:不能“动态”添加或删除列

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

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

    编辑后,选项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查询优化器可能会对如何访问一个设置的数据做出非常好的决定-但是当您的设置更改时,该执行计划将完全过时,因此可能导致糟糕的性能

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


    或者更好的方法是:为每个“场景”设置单独的存储过程,然后根据您的设置值从调用方调用相应的存储过程……

    动态创建所需的sql,然后使用exec执行它

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

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

    作为对编辑的回应:它取决于活动量和数据量。如果这些都不是让你的应用程序慢下来的问题,那么使用选项2。如果需要优化,请使用选项1。总的来说,我的建议是不要费心去猜测你需要在哪里进行优化,因为这通常会浪费你的开发时间。。但是,我知道可能存在安全问题。。i、 e.即使您使用变量列列表说了一个select语句,有人也可以传递一个子select/delete或其他信息?我想验证输入参数的通常过程无论如何都是好的,只是想知道是否还有其他人对此有一些提示?@DavidSheardown如果您将某人输入的文本逐字输入exec语句,那么是的,您将遇到安全问题。然而,在存储过程中使用exec语句并不一定意味着根据输入的内容存在安全漏洞。在exec语句中形成参数化查询也可能是保护流程安全的一个选项(同样,这取决于您如何使用输入)。